这是我的要求:
我正在设计一个将车辆添加到数据库的页面:
正常车辆信息[型号 - 库存]
其他一些功能[型号 - IList]
@model Model.ViewModel.VehicleViewModel
<div>
<div class='col-md-12'>
<div class="form-group">
<input id="mainFormSubmit" type="button" value="Save" class="btn btn-default" />
</div>
</div>
@{Html.RenderPartial("~/Views/Shared/_InventoryPartial.cshtml", Model.InventoryVM);}
@{Html.RenderPartial("~/Views/Shared/_StandardFeaturePartial.cshtml", Model.StandardFeatures);}
</div>
<script type="text/javascript">
$('#mainFormSubmit').click(function () {
$('#InventoryForm').submit();
$("#StandardFeatureForm").submit();
});
</script>
public class VehicleViewModel
{
public InventoryViewModel InventoryVM { get; set; }
public IList<StandardFeature> StandardFeatures { get; set; }
}
@model Model.ViewModel.InventoryViewModel
@{
var options = new AjaxOptions() { HttpMethod = "Post" };
}
<div class="container">
<div class="row">
<div class="col-md-12">
@using (Ajax.BeginForm("InventorySave", "AddVehicle", options, new { id = "InventoryForm" }))
{
<fieldset>
<legend>Inventory Info</legend>
<div class='col-md-6'>
<!-- VIN input-->
<div class="form-group">
@Html.LabelFor(x => x.VIN, new { @class = "col-md-4 control-label" })
<div class="col-md-7">
@Html.TextBoxFor(x => x.VIN, new { @class = "form-control", @placeholder = "VIN" })
</div>
</div>
</div>
</fieldset>
}
标准特征局部视图[_StandardFeaturePartial.cshtml]
==
@model IEnumerable<Model.DomainModel.StandardFeature>
@{
var options = new AjaxOptions() { HttpMethod = "Post" };
}
<div class="container">
<div class="row">
<div class="col-md-12">
@using (Ajax.BeginForm("StandardFeatureSave", "AddVehicle", options, new { id = "StandardFeatureForm" }))
{
当我点击索引页面SAVE按钮时,只有
$(&#39;#InventoryForm&#39)。提交(); $(&#34;#StandardFeatureForm&#34)。提交();
最后一个(StandardFeatureForm)正在执行。
如果此过程正确,请告知我们,这可能是导致此问题的原因。
答案 0 :(得分:2)
您不应该两次调用submit方法。根据浏览器的不同,您可能面临不同的问题:
在您的情况下,将两个部分视图包装在一个独特的表单中会更容易。
@using (Ajax.BeginForm("InventorySave", "AddVehicle", FormMethod.Post, new { id = "InventoryForm" }))
{
@{Html.RenderPartial("~/Views/Shared/_InventoryPartial.cshtml", Model.InventoryVM);}
@{Html.RenderPartial("~/Views/Shared/_StandardFeaturePartial.cshtml", Model.StandardFeatures);}
}
但是,当部分视图呈现时,它们不会为您要使用的较大的modelModel.ViewModel.VehicleViewModel生成正确的名称属性:
public void InventorySave(VehicleViewModel vehicleViewModel) {}
在这种情况下,您应该使用EditorTempmlate而不是部分视图。从部分观点来看,这很简单,这篇文章可以帮助您:Post a form with multiple partial views
基本上,将你的局部拖到文件夹〜/ Shared / EditorTemplates / 并重命名它们以匹配模型名称,它们是编辑器模板 对
最后是:
@model Model.ViewModel.VehicleViewModel
@using (Html.BeginForm("InventorySave", "AddVehicle", FormMethod.Post, new { id = "InventoryForm" }))
{
@Html.EditorFor(m => m.InventoryVM);
@Html.EditorFor(m => m.StandardFeatures});
}
答案 1 :(得分:0)
Ajax.BeginForm帮助器已经有一个与之关联的submit事件,它创建了一个Ajax POST请求。当您使用$('#InventoryForm').submit();
手动提交表单时,您同时调用这两个表单以及可能产生奇怪副作用的提交事件。
有几种方法可以解决这个问题。这是一个解决方案
使用Html.BeingForm帮助程序将表单更改为常规HTML表单。
修改脚本以创建ajax请求并使用表单数据
$('#InventoryForm').submit(function(e) {
e.preventDefault();
$.post($(this).attr("action"), $(this).serialize(), function(r) {
//Do something
});
});
$('#StandardFeatureForm').submit(function(e) {
e.preventDefault();
$.post($(this).attr("action"), $(this).serialize(), function(r) {
//Do something
});
});
希望这有帮助