在我的ASP.Net MVC项目中,我有以下ViewModel
public class ApproveItemViewModel
{
[Required]
public int ItemId { get; set; }
[Required]
public string ItemCode { get; set; }
}
我在控制器中有以下两种方法
[HttpGet]
public ActionResult ListPendingItems()
{
var items = new List<ApproveItemViewModel>();
//add few items here in above list
return View(vms);
}
[HttpPost]
public JsonResult ApproveItem(ApproveItemViewModel viewmodel)
{
return Json(new { success = success }, JsonRequestBehavior.AllowGet);
}
现在在我的剃刀视图中我想要的是使用Ajax调用为每个单独的项调用ApporveItem方法。所以我使用下面的代码创建了多个ajax表单。
@model IEnumerable<ApproveItemViewModel>
@foreach (var item in Model)
{
using (Ajax.BeginForm("ApproveItem", new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
UpdateTargetId = "dane"
}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table>
<tr>
<td>@Html.LabelFor(m => item.ItemId)</td>
<td>@Html.DisplayFor(m => item.ItemId)</td>
</tr>
<tr>
<td>@Html.LabelFor(m => item.ItemCode)</td>
<td>@Html.TextBoxFor(m => item.ItemCode))</td>
</tr>
<tr>
<td><input type="submit" value="Approve" /></td>
</tr>
</table>
}
}
然而,在控制器动作方法参数中,我将ItemId和ItemCode分别设为0和null。问题是什么,有人可以帮忙吗?我们如何使用ajax将viewmodel传递给action?
答案 0 :(得分:0)
问题很可能是视图中的Model Binder不知道如何绑定ApproveItemViewModel列表。
请参阅此答案以获得解释:https://stackoverflow.com/a/21191624/2521893
@model IEnumerable<ApproveItemViewModel>
@for (int i = 0; i < Model.Count; i++)
{
using (Ajax.BeginForm("ApproveItem", new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
UpdateTargetId = "dane"
}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<table>
<tr>
<td>@Html.LabelFor(m => Model[i].ItemId)</td>
<td>@Html.DisplayFor(m => Model[i].ItemId)</td>
</tr>
<tr>
<td>@Html.LabelFor(m => Model[i].ItemCode)</td>
<td>@Html.TextBoxFor(m => Model[i].ItemCode))</td>
</tr>
<tr>
<td><input type="submit" value="Approve" /></td>
</tr>
</table>
}
}
答案 1 :(得分:0)
此问题的原因是'参数'名称。您需要在cshtml端为控制器post动作的参数(即viewmodel)和迭代模型(item)保留相同的名称,然后才会发生绑定。请参阅以下两种不同的解决方案。
解决方案1 :修改cshtml页面: - 用@foreach替换@foreach(模型中的var项)(模型中的var viewmodel) 即,
@foreach (var viewmodel in Model)
解决方案2 :修改控制器操作: - 更改ApproveItem操作的参数名称。 即,
[HttpPost]
public JsonResult ApproveItem(ApproveItemViewModel item)
{
return Json(new { success = success }, JsonRequestBehavior.AllowGet);
}