将我的表格绑定到模型

时间:2012-05-24 13:35:23

标签: asp.net-mvc-3

我有一个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都存在问题。作为参数传递的模型的值为null:

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

    // Process order...

    return PartialView("Sales/_ConfirmSalesOrder");
}

所以quoteLines为空。如何将表单绑定到我的模型?

1 个答案:

答案 0 :(得分: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>

然后AJAX化表单:

$('#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;
});