नियंत्रक से @ Html.ActionLink MVC 4 के लिए पैरामीटर पास करें


109

इस पंक्ति में:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

मुझे blogPostId पर निम्नलिखित रनटाइम त्रुटि मिलती है:

पैरामीटर डिक्शनरी में नॉन-नॉलेबल टाइप '' System.Int32 '' के लिए 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.eb.Models.Blogs.BlogPostModel, बूलियन)' के पैरामीटर 'blogPostId' के लिए अशक्त प्रविष्टि है। 'Nop.Web.Controllers.BlogController'। एक वैकल्पिक पैरामीटर एक संदर्भ प्रकार, एक अशक्त प्रकार होना चाहिए, या एक वैकल्पिक पैरामीटर के रूप में घोषित किया जाना चाहिए। पैरामीटर नाम: पैरामीटर

मैं पहले से ही इसके लिए एक मूल्य प्रदान कर चुका हूं जैसे कि शीर्ष पर

    @{         
        var blogPostId = Model.Id;          
     }

मेरा नियंत्रक:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

क्या मुझसे कुछ गलत हो रही है? कृपया मुझे एक उदाहरण दें।

जवाबों:


257

आप Html.ActionLinkसहायक के गलत अधिभार का उपयोग कर रहे हैं । आपको लगता है routeValuesकि वास्तव में क्या है htmlAttributes! बस जेनरेट किए गए HTML को देखें, आप देखेंगे कि इस एंकर की href प्रॉपर्टी वैसी नहीं दिखती जैसी कि आप इसे देखने की उम्मीद करते हैं।

यहाँ आप क्या उपयोग कर रहे हैं:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

और यहाँ आपको क्या उपयोग करना चाहिए:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

इसके अलावा आपके कोड के साथ एक और बहुत गंभीर मुद्दा है। निम्नलिखित मार्ग

replyblogPostmodel = Model

आप संभवतः एक्शनलिंक में इस तरह की जटिल वस्तुओं को पास नहीं कर सकते। इसलिए इससे छुटकारा पाएं और BlogPostModelअपने कंट्रोलर एक्शन से पैरामीटर को भी हटा दें । आपको blogPostIdइस मॉडल को बनाए रखने वाले मॉडल से पुनर्प्राप्त करने के लिए पैरामीटर का उपयोग करना चाहिए , या यदि आप जीईटी कार्रवाई में मॉडल को पुनर्प्राप्त करने के लिए जहां से भी पसंद करते हैं:

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

जहां तक ​​आपकी प्रारंभिक समस्या गलत अधिभार से संबंधित है, तो मैं आपको नामांकित मापदंडों का उपयोग करके अपने सहायकों को लिखने की सलाह दूंगा:

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

अब न केवल यह कि आपका कोड अधिक पठनीय है, बल्कि उन हेल्पर्स के लिए Microsoft द्वारा बनाए गए ओवरलोड के गजलों के बीच आपको कभी भ्रम नहीं होगा।


आपको टिप्पणियों को बदलने की जरूरत है controllerNameऔरactionName
वेबदेवलर

@DarinDimitrov: मॉडल को पैरामीटर के रूप में कैसे पारित किया जाए?
नेट्रसडब्ल्यू

1
@ DarinDimitrov, @ webdeveloper: क्या मुझे एक्शनस्पेस पर [रिश्वत] का उल्लेख करने की आवश्यकता है?
नेट्रसडब्ल्यू

@NetraSW, आपको [HttpPost]एक्शन में नहीं होना चाहिए क्योंकि लिंक एक GET अनुरोध भेज रहा है। [HttpPost]इसका अर्थ है कि आपका नियंत्रक कार्य केवल POST अनुरोध के साथ सुलभ है।
डारिन दिमित्रोव

@DarinDimitrov: हो सकता है मैं इसे खुश कर सकता हूं? मॉडल प्रोपेटीज मान को खाली भेजता है। कृपया मेरा मार्ग दर्शन कीजिए।
नेट्रसडब्ल्यू

12

मुझे दो मापदंडों को पारित करना होगा:

/ नियंत्रक / कार्रवाई / Param1Value / Param2Value

इस तरफ:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

इस url को उत्पन्न करेगा

/ नियंत्रक / कार्रवाई / Param1Value? Param2Name = Param2Value

मैंने पैरामीटर एक में पैरामीटर दो को मर्ज करके वर्कअराउंड विधि का उपयोग किया और मुझे जो चाहिए वह मुझे मिला:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

और मुझे मिलता है:

/ नियंत्रक / कार्रवाई / Param1Value / Param2Value


जाहिर है, यह तब होता है जब Param1Value शून्य है। मैं सिर्फ एक ही समस्या का सामना करना पड़ा है।
१०

3

आप नीचे का उपयोग करके मानों को पास कर सकते हैं।

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

नियंत्रक:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

और URL जैसा दिखता है

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay

0

समस्या को मान के साथ होना चाहिए Model.Id जो अशक्त है। आप एक मान निर्दिष्ट करके पुष्टि कर सकते हैं, जैसे

@{         
     var blogPostId = 1;          
 }

यदि त्रुटि गायब हो जाती है, तो यू को यह सुनिश्चित करने की आवश्यकता है कि इसे देखने से पहले आपके मॉडल आईडी का मूल्य है


1
नहीं, यह समस्या नहीं है।
डारिन दिमित्रोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.