我有一个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]
行动中,ConfirmSalesOrder
和ConfirmLostOrder
都存在问题。作为参数传递的模型的值为null:
[HttpPost]
public ActionResult ConfirmSalesOrder(List<DayBookQuoteLines> quoteLines)
{
// Process order...
return PartialView("Sales/_ConfirmSalesOrder");
}
所以quoteLines
为空。如何将表单绑定到我的模型?
答案 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;
});