【发布时间】:2015-07-30 14:24:14
【问题描述】:
我正在创建一个 ASP.NET MVC 5 SQL Server(实体框架,数据库优先)应用程序,其中有一个订单记录和一组附加的行项目记录。用户应该能够通过“添加”按钮将新的行项目记录添加到视图模型,但在用户单击“保存”按钮之前,行项目不应提交到数据库。单击“添加”按钮不应该刷新页面——页面应该保持在原来的位置,只是添加了额外的行。
现在,我以这种方式添加了新行:
查看:
@model Models.OrderViewModel
<table style="width: 90%; margin: auto" id="divPartial">
<tr>
<th style="width: 25px">
Header 1
</th>
<th style="width: 25px">
Header 2
</th>
<th style="width: 25px">
Header 3
</th>
</tr>
@if (Model.LineItemRows.Count > 0)
{
for (int i = 0; i < Model.LineItemRows.Count; i++)
{
@Html.Partial("ViewRow", Model.LineItemRows[i])
}
}
</table>
<input type="button" id="mybutton" value="Add New Line Item" class="btn btn-default" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
$("#mybutton").click(function () {
$.ajax({
url: "../AddNewLineItem/",
cache: false,
type: "POST",
data: {
'viewModel': @Html.Raw(Json.Encode(Model)),
},
success: function (data) {
$('#divPartial').append(data);
},
error: function (reponse) {
alert("Error: " + reponse);
}
});
});
});
</script>
控制器:
[HttpPost]
public ActionResult AddNewLineItem(OrderViewModel viewModel)
{
OrderLineItemRowViewModel lineItemRow = new OrderLineItemRowViewModel();
// Set some defaults
lineItemRow.active = true;
lineItemRow.location = "I";
if (viewModel.LineItemRows != null) // This shouldn't ever be null
{
viewModel.LineItemRows.Add(lineItemRow);
}
return PartialView("ViewRow", lineItemRow);
}
当用户单击“添加”按钮时,jQuery 函数会序列化当前视图模型并将其发送回控制器。控制器使用一些默认选项创建一个新行,将其添加到传入的 viewmodel 行集中,然后返回代表新行的局部视图(并将新行的数据发送到局部视图中,以便我们知道如何填充它)。
这里缺少的是...如何将修改后的视图模型发送回原始视图?基本上,我在 AddNewLineItem() 中应该知道当前的视图模型,但我不知道它需要发送到哪里。
我对 ASP.NET MVC 还很陌生,所以如果我在这里遗漏了一些明显的东西,我深表歉意。
【问题讨论】:
标签: asp.net-mvc