0

这两天我试图解决这个问题。不幸的是我做不到。我不明白为什么我的“表单”将空值发送到某个类。你知道我该怎么做吗?真的这个问题让我很紧张。

参数字典包含“SportsStore.WebUI.Controllers.CartController”中方法“System.Web.Mvc.RedirectToRouteResult AddToCart(Int32, System.String)”的不可为空类型“System.Int32”的参数“Id_tow”的空条目'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:parameters 描述:当前web请求执行过程中发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:参数字典包含不可为空类型“System.Int32”的参数“Id_tow”的空条目,用于“System.Web.Mvc.RedirectToRouteResult AddToCart(Int32, System.String)”中的方法SportsStore.WebUI.Controllers.CartController'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

这是这个表格:

@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>

在我看来是显示正确的值,但将 null 发送到类(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>
}
4

2 回答 2

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 之间创建一些脆弱的依赖关系。

于 2012-08-08T09:19:38.073 回答
1

在生成的hmtl的以下部分可以看到问题:

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

这种名称差异会阻止 mvc 路由引擎将隐藏字段的值与名为 Id_tow 的参数相关联。最简单的解决方案是更改参数的名称以匹配字段的 id 或名称。

于 2012-08-08T09:31:07.617 回答