2010-03-23 8 views
37

मैं डेटाबेस में डेटा को संशोधित करने के लिए व्यवस्थापक के क्रम में एक संपादन पृष्ठ को लागू करने का प्रयास कर रहा हूं। दुर्भाग्यवश मुझे एक त्रुटि आ रही है।"पैरामीटर शब्दकोश में पैरामीटर के लिए एक शून्य प्रविष्टि है" - कैसे ठीक करें?

नीचे कोड:

public ViewResult Edit(int productId) { 
     // Do something here 
} 

लेकिन मैं इस त्रुटि हो रही है:

"The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type. 
Parameter name: parameters" 

मैं इस तरह Global.asax.cs में मेरा रास्ता बदल दिया:

routes.MapRoute(
"Admin", 
"Admin/{action}/{ productId}", 
new { controller = "Admin", action = "Edit", productId= "" } 
); 

लेकिन अभी भी मैं हो रही है त्रुटि ।

उत्तर

44

productId के लिए रिक्त स्ट्रिंग (आपके डिफ़ॉल्ट मार्ग में) फ्रेमवर्क द्वारा एक अशक्त प्रविष्टि को पार्स हो जाएगा यही कारण है, और int के बाद से null ... आप त्रुटि हो रही है की अनुमति नहीं है।

बदलें:

public ViewResult Edit(int productId) 

आप कॉलर के लिए एक उत्पाद आईडी में पारित करने के लिए है, जो है क्या यह है कि आप क्या करना चाहते हैं की तरह लग रहा है नहीं अनुमति देना चाहते हैं

public ViewResult Edit(int? productId) 

को आपके मार्ग को कॉन्फ़िगर करने के तरीके के आधार पर।

तुम भी जब कोई productId आपूर्ति की है के लिए कुछ ज्ञात डिफ़ॉल्ट में पारित करने के लिए अपने डिफ़ॉल्ट मार्ग को फिर से कॉन्फ़िगर कर सकते हैं:

routes.MapRoute( 
    "Admin", 
    "Admin/{action}/{ productId}", 
    new { controller = "Admin", action = "Edit", productId= -1 } 
0

मानक "पूर्णांक" वर्ग (int32) शून्य मान स्वीकार नहीं करता है, और यह उस मामले में एक खाली स्ट्रिंग से int में एक कास्ट विफल हो जाएगा और इसे शून्य करने की कोशिश करें और असाइन करें।

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

4

productIdint प्रकार पर बाध्य होना चाहिए।

new {controller="Admin", action="Edit"}, 
new {productId = @"\d+" } 
1

शायद आप आवश्यक डेटा (इस मामले में 'productId') को पास में भूल गए हैं।
मैं तुम्हें सूचकांक पृष्ठ मैं भी "index.cshtml देखें \ व्यवस्थापक \"

<td> 
     @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) | 
     @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId 
     @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId }) 
    </td> 

असफल के रूप में यह मान लिया है में लिंक पर क्लिक करके विस्तार तक पहुँचने के लिए ऐसा करने के लिए सभी होना करने के लिए पैरामीटर परिणाम होगा की कोशिश मान इस प्रकार त्रुटि का कारण बनता है।

public class MyControllerBase 
{ 
    //... 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Exception != null) 
     { 
      var targetSite = filterContext.Exception.TargetSite; 
      if (targetSite.DeclaringType != null) 
       if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName) 
        if (targetSite.Name == "ExtractParameterFromDictionary") // Note: may be changed in future MVC versions 
        { 
         filterContext.ExceptionHandled = true; 
         filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); 
         return; 
        } 
      //... 
     } 
     // ... 
    } 
} 
6

यहाँ जिस तरह से कैसे किसी भी नियंत्रक वापस लाने के लिए इस तरह के तर्क त्रुटियों को अनदेखा करने के लिए है असल में मेरे इंडेक्स व्यू में निम्न कोड है।

@Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) | 

हालांकि मेरी नियंत्रक में मेरी संपादित विधि को पढ़ने के लिए

@Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) | 

समस्या

15

मैं एक ही समस्या में आए में प्रो ASP.Net

समाधान था काम किया SportStore उदाहरण का पालन करना:

0

मार्ग पर यह बदल रहा है तय

public ViewResult Edit(int productId) 

मेरी सूचकांक दृश्य बदल रहा है के रूप में परिभाषित किया गया था सकता है उसी यूआरएल का उपयोग करने वाले अन्य मार्गों को निहित करें। इसे सरल रखने और सभी अड्डों को कवर करने के लिए।

[HttpGet] 
public ActionResult ThePage(int id = -1) 
{ 
    if(id == -1) 
    { 
     return RedirectToAction("Index"); 
    } 

    //Or proceed as normal 
} 

यह है कि अगर यह उदाहरण के लिए (जब आप पृष्ठ का उपयोग क्योंकि आप एक आईडी के लिए आवश्यक हैं एक त्रुटि मिल रहा है है, ... यह भी बहुत अच्छा है लोगों को पता बार जब वे कर रहे हैं में यूआरएल डाल नहीं माना जाता है) तो पैरामीटर को वैकल्पिक मान पर सेट करें।

संपादित करें: माफ करना int, जब तक सवाल पूछा गया

संबंधित मुद्दे