MVC:将值从视图传递到控制器
本文关键字:控制器 视图 MVC | 更新日期: 2023-09-27 18:20:44
我正试图在MVC中将值从视图传递到控制器。我使用的是ViewModel,通常只要名称相同,值就会绑定到属性。但是,由于值是通过foreach循环生成的,因此值的名称与视图模型中属性的名称不匹配。
我通过将值分配给Razor中的一个变量来解决这个问题。然而,我的一个值在表单的文本框中,并且该值没有传递给控制器,我无法找出原因。
单击按钮时,我得到一个null异常。
VIEW代码如下:
@model PagedList.IPagedList<Mojito.Domain.ViewModels.ShoppingCartProductItem>
@using System.Web.UI.WebControls
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Mojito Products</h2>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstOrDefault().Description)
</th>
<th>
@Html.ActionLink("Price", "Index", new { sortOrder = ViewBag.SortByPrice, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.DisplayNameFor(model => model.FirstOrDefault().Quantity)
</th>
<th>
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Quantity)
</td>
<td>
@{string Description = item.Description;}
@{decimal Price = item.Price;}
@{int Quantity = item.Quantity; }
@using (Html.BeginForm("AddToCart", "ShoppingCart", FormMethod.Post))
{
<div class="pull-right">
@if (Request.Url != null)
{
<input type="text" hidden="true" name="Description" value=@Description />
<input type="text" hidden="true" name="Price" value=@Price />
<input type="text" hidden="true" name="Quantity" value=@Quantity />
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
<input type="submit" class="btn btn-success" value="Add to cart" />
}
</div>
}
</td>
</tr>
}
</table>
<div class="col-md-12">
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
</div>
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
下方的控制器代码
public ActionResult AddToCart(Cart cart, MojitoProduct product, string returnUrl, int Quantity =1)
{
if (product != null)
{
cart.AddItem(product, Quantity);
}
return RedirectToAction("Index", new { returnUrl });
}
不要使用foreach。请改用for循环,在此循环中,使用索引限定属性的完整路径。
更好的方法是:对ShoppingCartProductItem
使用Edit或DisplayTemplate。这也将保持你的道路。
您必须使用for循环而不是foreach:
@for (int i=0;i < Model.Count; i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model[i].Description)
</td>
<td>
@Html.DisplayFor(modelItem => Model[i].Price)
</td>
<td>
@Html.TextBoxFor(modelItem => Model[i].Quantity)
</td>
..........................
..........................
..........................
}
您也可以通过发布List<ShoppingCartProductItem>
使用一个表单发布所有内容,请参阅模型绑定到列表
您的文本框使值脱离表单。
尝试低于
@using (Html.BeginForm("AddToCart", "ShoppingCart", FormMethod.Post))
{
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Quantity)
</td>
<td>
@{string Description = item.Description;}
@{decimal Price = item.Price;}
@{int Quantity = item.Quantity; }
<div class="pull-right">
@if (Request.Url != null)
{
<input type="text" hidden="true" name="Description" value=@Description />
<input type="text" hidden="true" name="Price" value=@Price />
<input type="text" hidden="true" name="Quantity" value=@Quantity />
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
<input type="submit" class="btn btn-success" value="Add to cart" />
}
</div>
</td>
</tr>
}
}
我通过使用new并强制使用参数名称在短期内解决了这个问题。
@Html.HidddeFor(modelItem=>t.NoOfUsers,new{Name="NoOfUsers",id="NoOfUsers"})