0

我有一个包含我的模型列表的 ViewModel,如下所示:

public class OrderConfirm
{
    public ICollection<DayBookQuoteLines> SalesLines { get; set; }
    public ICollection<DayBookQuoteLines> LostLines { get; set; }
    public string Currency { get; set; }
}

然后我在我的视图中使用这个 ViewModel,如下所示:

@model btn_intranet.Areas.DayBook.Models.ViewModels.OrderConfirm
@{
    ViewBag.Title = "Daybook - Order Confirmation";
}

<h6>Sales Lines</h6>
<div id="SalesOrders">
@using (Ajax.BeginForm("ConfirmSalesOrder", new AjaxOptions()
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "SalesOrders",
    OnBegin = "SalesOrderConfirm"
}))
{
    @foreach(var item in Model.SalesLines)
    {
        <p>@item.ItemName</p>
        <p>@item.Qty</p>

        @* Other Properties *@
    }

    <input type="submit" value="Submit Sales Order" />
}
</div>

<h6>Lost Lines</h6>
<div id="LostOrders">
@using (Ajax.BeginForm("ConfirmLostOrder", new AjaxOptions()
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "LostOrders",
    OnBegin = "LostOrderConfirm"
}))
{
    @foreach(var item in Model.SalesLines)
    {
        <p>@item.ItemName</p>
        <p>@item.Qty</p>

        @* Other Properties *@
    }

    <input type="submit" value="Submit Lost Order" />
}
</div>

问题是,在我的[HttpPost]行动中,ConfirmSalesOrderConfirmLostOrder. 作为参数传递的我的模型的值为空:

[HttpPost]
public ActionResult ConfirmSalesOrder(List<DayBookQuoteLines> quoteLines)
{

    // Process order...

    return PartialView("Sales/_ConfirmSalesOrder");
}

quoteLines空值也是如此。如何将表单绑定到我的模型?

4

1 回答 1

2

您的表单中没有任何输入字段可以将值发送到服务器。您只是在显示它们。这就是为什么当您提交表单时它们为空 => 没有任何东西发送到服务器。

但是,如果在此表单中,用户不应该修改任何值,您需要做的就是将一个 id 传递给控制器​​操作,这将允许您从您获取模型的完全相同的位置获取模型GET 呈现此表单的操作。

在这种情况下,您的操作将如下所示:

[HttpPost]
public ActionResult ConfirmSalesOrder(int id)
{
    List<DayBookQuoteLines> quoteLines = ... fetch them the same way as in your GET action
    // Process order...

    return PartialView("Sales/_ConfirmSalesOrder");
}

另一方面,如果用户应该修改表单中的值,您需要向他提供必要的输入字段:文本框、复选框、单选按钮、下拉列表、textereas 等内容......并且为了生成正确的名称对于那些输入字段,我建议您使用编辑器模板,而不是在视图中编写 foreach 循环。


更新:

似乎用户不应该编辑数据,因此没有相应的输入字段。在这种情况下,为了在 AJAX 请求期间保留模型,您可以将 替换Ajax.BeginForm为普通Html.BeginForm的,然后使用 jQuery 手动连接 AJAX 请求。这种方法的优点是现在您拥有更多控制权,例如您可以将整个模型作为 JSON 请求发送。为此,您可以将模型存储为视图内的 javascript 编码变量:

<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));
</script>

然后 AJAXify 表单:

$('#formId').submit(function() {
    $.ajax({
        url: this.action,
        type: this.method,
        contentType: 'application/json',
        data: JSON.stringify({ quoteLines: model }),
        success: function(result) {
            $('#someTargetIdToUpdate').html(result);
        }
    });
    return false;
});
于 2012-05-24T13:37:15.137 回答