MVC3 - 可空类型(表单没有向控制器发送值)

时间:2012-08-08 09:06:05

标签: asp.net-mvc asp.net-mvc-3

我试着在这两天内解决这个问题。不幸的是我无法做到这一点。我不明白为什么我的“表单”会将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>
}

2 个答案:

答案 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或名称。