2012-08-08 70 views
0

我在這兩天試圖解決這個問題。不幸的是,我無法做到這一點。我不明白爲什麼我的「表單」向某些類發送空值。你有沒有想到我必須做什麼?真的這個問題讓我很緊張。MVC3 - 可空類型(表格didn`t發送值控制器)

The parameters dictionary contains a null entry for parameter 'Id_tow' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.RedirectToRouteResult AddToCart(Int32, System.String)' in 'SportsStore.WebUI.Controllers.CartController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: The parameters dictionary contains a null entry for parameter 'Id_tow' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.RedirectToRouteResult AddToCart(Int32, System.String)' in 'SportsStore.WebUI.Controllers.CartController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

下面是這種形式:

@model SportsStore.WebUI.Models.SomeView 
@using SportsStore.WebUI.HtmlHelpers 
@using SportsStore.WebUI.Controllers 
@using SportsStore.Entities 

@{ 
    ViewBag.Title = "List"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>List</h2> 

@foreach (var p in Model.Towar) 
{ 
<div class="item"> 
<h3>@p.Nazwa</h3> 
@p.Opis 

@using(Html.BeginForm("AddToCart", "Cart")) { 
@Html.HiddenFor(x => @p.Id_tow) 
@Html.Hidden("returnUrl", Request.Url.PathAndQuery) 
<input type="submit" value="+ Add to cart" /> 
} 

<h4>@p.Cena.ToString("c")</h4> 
</div> 
} 

<h2>List</h2> 

@foreach (var b in Model.Kategorie) 
{ 
<div class="item"> 
<h3>@b.Nazwa</h3> 
</div> 
} 

<div class="pager"> 
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", 
new {page = x, category = Model.CurrentCategory})) 
</div> 

在我看來是顯示正確的價值觀,但發送空類(HTML源代碼)控制器車

<div class="item"> 
<h3>Piłka</h3> 
Piłka Firmy Nike 

<form action="/Cart/AddToCart" method="post"><input data-val="true" data-val-number="The field Id_tow must be a number." data-val-required="The Id_tow field is required." id="p_Id_tow" name="p.Id_tow" type="hidden" value="1" /><input id="returnUrl" name="returnUrl" type="hidden" value="/" /><input type="submit" value="+ Add to cart" /> 
</form> 
<h4>59,80 zł</h4> 
</div> 

其中有一部分得到空值:

public RedirectToRouteResult AddToCart(int Id_tow, string returnUrl) 
      { 
       Towar product = repository.Towar 
       .FirstOrDefault(p => p.Id_tow == Id_tow); 
       if (product != null) 
       { 
        GetCart().AddItem(product, 1); 
       } 

       return RedirectToAction("Index", new { returnUrl }); 
      } 

如果我會把我的價值觀一切工作正確的,但當然這不是解決問題

public RedirectToRouteResult AddToCart(int Id_tow = 1, string returnUrl = "www.gmail.com") 
      { 
       Towar product = repository.Towar 
       .FirstOrDefault(p => p.Id_tow == Id_tow); 
       if (product != null) 
       { 
        GetCart().AddItem(product, 1); 
       } 

       return RedirectToAction("Index", new { returnUrl }); 
      } 

此修復程序的問題,如果沒有你的幫助,我將不能夠解決這個問題。由於

@foreach (var p in Model.Towar) 
{ 
<div class="item"> 
<h3>@p.Nazwa</h3> 
@p.Opis 

@{ 
    int Id_tow = @p.Id_tow; 
} 


@using(Html.BeginForm("AddToCart", "Cart")) { 
@Html.HiddenFor(x => Id_tow) 
@Html.Hidden("returnUrl", Request.Url.PathAndQuery) 
<input type="submit" value="+ Add to cart" /> 
} 

<h4>@p.Cena.ToString("c")</h4> 
</div> 
} 
+2

輸入名稱(p.Id_tow)和參數名稱(Id_tow)是不一樣的。 – Hadas 2012-08-08 09:13:19

回答

1

您可以取代

public RedirectToRouteResult AddToCart(int Id_tow, string returnUrl) 
      { 
       Towar product = repository.Towar 
       .FirstOrDefault(p => p.Id_tow == Id_tow); 
       if (product != null) 
       { 
        GetCart().AddItem(product, 1); 
       } 

       return RedirectToAction("Index", new { returnUrl }); 
      } 

public RedirectToRouteResult AddToCart(Towar tow, string returnUrl) 
      { 
       Towar product = repository.Towar 
       .FirstOrDefault(p => p.Id_tow == tow.Id_tow); 
       if (product != null) 
       { 
        GetCart().AddItem(product, 1); 
       } 

       return RedirectToAction("Index", new { returnUrl }); 
      } 

或者你可以使用Html.Hidden("Id_tow", @p.Id_tow),但這不會被推薦,因爲它創建了一個位視圖之間的脆性依賴和控制器。

+0

它'添加的東西(buuton工作),但是當我點擊鏈接「什麼購買」我什麼也看不見 – RPD 2012-08-08 09:26:53

+0

所以它與repository.Towar .FirstOrDefault(P => p.Id_tow ==拖返回一個有效的值。 Id_tow);或者當你調試時它只是返回null? – AlexC 2012-08-08 09:32:25

+0

你可以看看我的帖子 - >「你知道這是如何宣佈這是正確的?也許這是一個問題?」因爲我認爲良好的聲明可以解決這個問題。你的想法是正確配音,但我無法看到價值。我的數據庫中的「Towar」是一個表格。 – RPD 2012-08-08 09:35:21

1

的問題可以看出,在所生成的HMTL以下部分:

id="p_Id_tow" name="p.Id_tow" 

在名稱這種差異防止了MVC路由引擎從隱藏字段的值與名爲Id_tow參數關聯。最簡單的解決方案是更改參數的名稱以匹配字段的ID或名稱。

+0

公共RedirectToRouteResult AddToCart(INT p_Id_tow,串RETURNURL =「www.wp.pl」){}我這裏改名藉此值,但問題是,所有的時間。 – RPD 2012-08-08 09:40:33

相關問題