ASP.NET MVC - नियंत्रक को पासिंग पैरामीटर


105

मेरे पास एक्शन विधि के साथ एक नियंत्रक है:

public class InventoryController : Controller
{
    public ActionResult ViewStockNext(int firstItem)
    {
        // Do some stuff
    }
}

और जब मैं इसे चलाता हूं तो मुझे एक त्रुटि मिलती है:

पैरामीटर शब्दकोश में 'firstItem' पैरामीटर के लिए 'System.Int32' प्रकार का एक वैध मान नहीं है। एक पैरामीटर को वैकल्पिक बनाने के लिए इसका प्रकार या तो एक संदर्भ प्रकार या एक अशक्त प्रकार होना चाहिए।

मेरे पास यह एक बिंदु पर काम कर रहा था और मैंने मापदंडों के बिना फ़ंक्शन का प्रयास करने का निर्णय लिया। यह पता लगाना कि नियंत्रक लगातार नहीं था मैंने पैरामीटर को वापस डाल दिया, अब जब मैं विधि को कॉल करता हूं तो यह पैरामीटर को पहचानने से इनकार कर देता है।

मैं इस url सिंटैक्स का उपयोग कार्रवाई को कॉल करने के लिए कर रहा हूं:

http://localhost:2316/Inventory/ViewStockNext/11

कोई भी विचार क्यों मुझे यह त्रुटि मिलेगी और इसे ठीक करने के लिए मुझे क्या करने की आवश्यकता है?

मैंने एक और तरीका जोड़ने की कोशिश की है जो एक पूर्णांक को वर्ग में ले जाता है यह उसी कारण से विफल भी होता है। मैंने एक जोड़ने की कोशिश की है जो एक स्ट्रिंग लेता है, और स्ट्रिंग को शून्य पर सेट किया जाता है। मैंने मापदंडों के बिना एक जोड़ने की कोशिश की है और यह ठीक काम करता है, लेकिन निश्चित रूप से यह मेरी आवश्यकताओं के अनुरूप नहीं होगा।

जवाबों:


106

आपकी रूटिंग को इसकी तर्ज पर स्थापित करने की आवश्यकता है {controller}/{action}/{firstItem}। यदि आपने रूटिंग को {controller}/{action}/{id}अपनी global.asax.csफ़ाइल में डिफ़ॉल्ट के रूप में छोड़ दिया है , तो आपको अंदर जाने की आवश्यकता होगी id

routes.MapRoute(
    "Inventory",
    "Inventory/{action}/{firstItem}",
    new { controller = "Inventory", action = "ListAll", firstItem = "" }
);

... या उसके करीब कुछ।


44
या सिर्फ "आईडी" का नाम बदलकर "आईडी" करें
काइल ट्रुबरमैन

8
प्लस यह दुनिया MapRoute के लिए एक बाधा वस्तु जोड़ने के लिए बुद्धिमान होना चाहिए, जैसे new { firstItem = @"\d" }:। इस तरह यह केवल तभी स्वीकार करेगा जब पैरामीटर किसी प्रकार की संख्या है। आप अपनी पसंद के अनुसार रीगेक्स को संशोधित कर सकते हैं, और यहां तक ​​कि दशमलव की संख्या को भी सीमित new { firstItem = @"\d{4}" }कर सकते हैं , जैसे: - अब यह केवल दो नंबर लंबा हो सकता है। संपादित करें: पूरी तरह से संशोधित MapRoute का उदाहरण: jsfiddle.net/HJRgT
KristianB

86

आप पहले आईडी में बदल सकते हैं और यह काम करेगा

आप Global.asax पर रूटिंग को बदल सकते हैं (मैं इसे पुनः नहीं जोड़ता)

और, विश्वास नहीं कर सकता कि किसी ने भी इसका उल्लेख नहीं किया है, आप कॉल कर सकते हैं:

http://localhost:2316/Inventory/ViewStockNext?firstItem=11

एक @ Url.Action में होगा:

@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});

आप जो कर रहे हैं उसके प्रकार के आधार पर, अंतिम अधिक उपयुक्त होगा। इसके अलावा आपको ViewStockNext एक्शन नहीं करने पर विचार करना चाहिए और इसके बजाय इंडेक्स के साथ ViewStock एक्शन करना चाहिए। (मेरे 2 सेंट)


15

जरेट मेयर के जवाब को फिर से बताने के लिए , आपको पैरामीटर नाम को 'आईडी' में बदलना होगा या इस तरह से एक मार्ग जोड़ना होगा:

routes.MapRoute(
        "ViewStockNext", // Route name
        "Inventory/ViewStockNext/{firstItem}",  // URL with parameters
        new { controller = "Inventory", action = "ViewStockNext" }  // Parameter defaults
    );

इसका कारण डिफ़ॉल्ट मार्ग है जिसमें केवल कोई पैरामीटर या 'id' नामक एक पैरामीटर के साथ कार्यों की तलाश है।

संपादित करें: हेह, कोई बात नहीं जेरेट ने पोस्ट करने के बाद एक मार्ग उदाहरण जोड़ा।


8

या रूट एट्रिब्यूट के साथ करें:

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}

यह संपत्ति पुराने MVC संस्करणों के साथ काम नहीं कर सकती है।
सुत अतान पीएचडी

इसके अलावा, काम करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि आपने routes.MapMvcAttributeRoutes();आवेदन की RegisterRoutes(RouteCollection)विधि के भीतर कॉल किया है (आमतौर पर App_Start \ RouteConfig.cs में मचान)। यह वहाँ डिफ़ॉल्ट रूप से नहीं हो सकता है।
डेनियल स्कॉट

7

हेडस्प्रिंग ने एक अच्छा पुस्तकालय बनाया जो आपको एक्शन पर विशेषताओं में अपने मापदंडों में उपनाम जोड़ने की अनुमति देता है। यह इस तरह दिखता है:

[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
    // Do some stuff
}

इसके साथ आपको एक अलग पैरामीटर नाम को संभालने के लिए बस अपनी रूटिंग को बदलना नहीं है। पुस्तकालय भी कई बार इसे लागू करने का समर्थन करता है ताकि आप कई पैरामीटर वर्तनी (जब आपके सार्वजनिक इंटरफ़ेस को तोड़ने के बिना रीफ़ैक्टरिंग कर सकें) मैप कर सकें।

आप इसे नुगेट से प्राप्त कर सकते हैं और जेफरी पलेर्मो के लेख को यहां पढ़ सकते हैं


7

public ActionResult ViewNextItem(int? id)idपूर्णांक को एक अशक्त प्रकार बनाता है , स्ट्रिंग की कोई आवश्यकता नहीं है <-> अंतर रूपांतरण।


3

ASP.NET कोर टैग हेल्पर सुविधा का उपयोग:

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>

विडंबना यह है कि सबसे छोटा उत्तर सबसे अच्छा है (यह एक)।

1

इसे पूरा करने का एक और तरीका है (स्टीफन वाल्थर के पेजर उदाहरण में अधिक विवरण में वर्णित है)

अनिवार्य रूप से, आप दृश्य में एक लिंक बनाते हैं:

Html.ActionLink("Next page", "Index", routeData)

PathData में आप नाम / मान युग्म निर्दिष्ट कर सकते हैं (जैसे, pathData ["पृष्ठ"] = 5), और नियंत्रक अनुक्रमणिका फ़ंक्शन में संबंधित पैरामीटर मान प्राप्त करते हैं। अर्थात्,

public ViewResult Index(int? page)

पृष्ठ 5 के रूप में पारित कर दिया जाएगा । मुझे स्वीकार करना होगा, यह काफी असामान्य है कि स्ट्रिंग ("पेज") स्वचालित रूप से एक चर बन जाता है - लेकिन यही है कि एमवीसी अन्य भाषाओं में भी काम करता है ...


0

"आईडी" के विशेष उपचार का कारण यह है कि इसे डिफ़ॉल्ट रूट मैपिंग में जोड़ा जाता है। इसे बदलने के लिए, Global.asax.cs पर जाएं, और आपको निम्नलिखित पंक्ति मिलेगी:

routes.MapRoute ("Default", "{controller}/{action}/{id}", 
                 new { controller = "Home", action = "Index", id = "" });

इसे इसमें बदलें:

routes.MapRoute ("Default", "{controller}/{action}", 
                 new { controller = "Home", action = "Index" });

0

या, आप पैरामीटर प्रकार को स्ट्रिंग में बदलने का प्रयास कर सकते हैं, फिर स्ट्रिंग को विधि में पूर्णांक में बदल सकते हैं। मैं एमवीसी के लिए नया हूं, लेकिन मेरा मानना ​​है कि आपको अपनी पैरामीटर सूची में अशक्त वस्तुओं की आवश्यकता है, तो नियंत्रक कैसे संकेत देगा कि ऐसा कोई पैरामीटर प्रदान नहीं किया गया था? इसलिए...

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