我试着在这两天内解决这个问题。不幸的是我无法做到这一点。我不明白为什么我的“表单”会将null值发送给某个类。你知道我要做什么吗?真的这个问题让我很紧张。
参数字典包含参数的空条目 'Id_tow'为非可空类型'System.Int32'的方法 'System.Web.Mvc.RedirectToRouteResult AddToCart(Int32,System.String)' 在'SportsStore.WebUI.Controllers.CartController'中。可选的 参数必须是引用类型,可空类型或声明为 一个可选参数。参数名称:参数说明:An 在执行当前Web期间发生了未处理的异常 请求。请查看堆栈跟踪以获取有关的更多信息 错误以及它在代码中的起源。
异常详细信息:System.ArgumentException:参数字典 包含非可空类型的参数“Id_tow”的空条目 方法'System.Web.Mvc.RedirectToRouteResult''System.Int32' AddToCart(Int32,System.String)'in 'SportsStore.WebUI.Controllers.CartController'。可选参数 必须是引用类型,可空类型,或声明为 可选参数。参数名称:参数
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
以下是此表格:
@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源代码)发送null
<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>
Controller Cart获取空值的部分:
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>
}
答案 0 :(得分: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)
,但不建议这样做,因为它会在View和Controller之间产生一些脆弱的依赖关系。
答案 1 :(得分:1)
问题可以在生成的hmtl的以下部分中看到:
id="p_Id_tow" name="p.Id_tow"
这种名称差异会阻止mvc路由引擎将隐藏字段的值与名为Id_tow的参数相关联。最简单的解决方案是更改参数的名称以匹配字段的ID或名称。