2008-10-01 15 views
87

मैं एक कार्य विधि के साथ एक नियंत्रक के रूप में निम्नानुसार है:ASP.NET MVC - नियंत्रक पैरामीटर प्रदान करने के

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

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

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

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

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

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

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

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

उत्तर

94

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

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

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

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

कारण डिफ़ॉल्ट मार्ग केवल कोई पैरामीटर या नामक पैरामीटर के साथ कार्यों के लिए दिखाई देता है:

+37

या "firstItem" को "id" –

+8

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

15

Jarret Meyer's answer अलग तरीके से व्यक्त करने के लिए, आप 'आईडी' के लिए पैरामीटर नाम बदलने के लिए या इस तरह एक मार्ग को जोड़ने की आवश्यकता 'आईडी'।

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

0

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

public ActionResult ViewNextItem(string id)... 
7

public ActionResult ViewNextItem(int? id)id पूर्णांक एक नल प्रकार, स्ट्रिंग < की कोई आवश्यकता नहीं बनाता है। (स्टीफन वाल्थर के दशक में अधिक जानकारी के में वर्णित

1

एक और तरीका है कि पूरा करने के लिए नहीं है Pager example

अनिवार्य रूप से, आप ध्यान में रखते हुए एक लिंक बनाने:

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

routeData में आप नाम/मान युग्म निर्दिष्ट कर सकते हैं (उदाहरण के लिए, रूटडाटा ["पृष्ठ"] = 5), और नियंत्रक इंडेक्स फ़ंक्शन में संबंधित पैरामीटर मान प्राप्त करते हैं।यही कारण है,

public ViewResult Index(int? page) 

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

74

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

आप Global.asax पर रूटिंग बदल सकते हैं (मैं recommed नहीं है कि)

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

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

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

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

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

+4

यह वही है, जो मैं देख रहा हूं :) thx – sasjaq

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" }); 
7

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

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

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

आप Nuget से इसे पाने और रूट गुण के साथ पर यह here

3

जेफरी पलेर्मो के लेख पढ़ सकते हैं या यह कर सकते हैं:

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

यह संपत्ति पुरानी एमवीसी संस्करणों के साथ काम नहीं कर सकती है। –

0

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

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a> 
संबंधित मुद्दे