来自具有IEnumerable model / viewmodel的剃刀视图的多个ajax请求

时间:2016-11-30 13:26:21

标签: c# asp.net-mvc razor ajax.beginform

在我的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?

2 个答案:

答案 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);
}