【发布时间】:2015-07-22 11:50:13
【问题描述】:
我是 asp.net mvc 的新手,所以我失败的原因也可能是一些基本的原因,但经过近一天的工作,我似乎无法找到它。
我要做的是从索引视图中获取已编辑的模型并将其传递给没有视图的第二个操作,并在相关控制器中返回 return RedirectToAction("Index")。在OrdersItemsController 我的操作如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MarkedShipped(IEnumerable<orders_items> orderItems)
{
if (ModelState.IsValid)
{
foreach (var item in orderItems)
{
unitOfWork.GenericRepository<orders_items>().Update(item);
}
}
return RedirectToAction("Index");
}
在视图的 OrdersItems 文件夹中的 Index.cshtml 中,我所做的如下:
@model IEnumerable<Project.DataAccess.orders_items>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm("MarkedShipped", "OrdersItems", new { orderItems = Model }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.quantity)
</th>
<th>
@Html.DisplayNameFor(model => model.itemprice)
</th>
<th>
@Html.DisplayNameFor(model => model.trackingnumber)
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.quantity)
</td>
<td>
@Html.DisplayFor(modelItem => item.itemprice)
</td>
<td>
@Html.EditorFor(modelItem => item.trackingnumber)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.itemid })
</td>
</tr>
}
</table>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="MarkShipped" class="btn btn-default" />
</div>
</div>
}
我的问题是,我无法使用 orderItems 参数从视图中获取模型,我不确定这是否是我想要完成的正确“语法”;但是当调用该操作时,orderItems 得到的是orders_items 的列表,其中Count = 0 不是空值。
我也检查了是否存在应用程序级别的异常,但在 Global.asax 中的 Application_Error 没有发现异常
我现在被困了一天,所以如果有人能指出如何将模型(或“编辑后的数据”)传递给我更新数据库的操作,我将不胜感激。谢谢。
【问题讨论】:
-
将 FormMethod.Post 放入 BeginForm 参数中。
-
您不能使用
foreach循环 - 它会生成重复的name属性,而没有绑定到集合所需的索引器,并且重复的id属性是无效的html。您需要使用for循环(或自定义EditorTemplate用于您的模型类型)。你的模型需要是IList<T>,然后是@for(int i = 0; i < Model.Count; i++) { @Html.EditorFor(m => m[i].trackingnumber) ...} -
而且您不能将模型添加为路由参数 - 它是一个集合,这意味着绑定将失败(查看您生成的 html 以了解)。无论如何,添加原始模型作为路由参数有什么意义(您已经知道它在服务器中是什么)。
-
我认为编辑后的模型是作为参数路由的,因为 EditorFor 助手直接与给定属性链接,我的理解是:它直接更改模型属性的项目。所以当传递模型时,我以为我传递了更新的集合。
-
@Neel 我也试过了,但没有任何区别。
标签: c# asp.net razor asp.net-mvc-5