我正在尝试通过AJAX实现一些保存功能。我有一个视图,其中定义的控件如下所示:从模型中填充:
@Html.LabelFor(model => model.mediaName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.mediaName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.mediaName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.mediaName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.mediaName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.mediaName, "", new { @class = "text-danger" })
当用户修改数据并单击保存按钮时,View可以从这些控件构建新数据并将其发送到Controller(它只是将模型保存到数据库)。
我试图通过AJAX做同样的事情,但是我在访问"已经构建的"时遇到了问题。来自控件的模型......
function saveDetails() {
var model = //HOW I GET THE MODEL?
$.ajax({
url: '/Media/SaveDetails',
dataType: 'html',
data: {
obj: model
},
success: function (data) {
}
});
}
我有什么方法可以访问该模型吗?或者我应该按控制构建它?
编辑:这就是我期望控制器获取操作的方式: (中等是模型中使用的实体)
public ActionResult SaveDetails(DomainModel.Medium obj)
{
db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();
return PartialView("_MediaModalDetails", obj);
}
答案 0 :(得分:2)
由于表单在添加AJAX之前正常工作,大概你有<form>
包围输入元素?如果是这样,您可以序列化该表单。因此,举例来说,假设您的表单有id="myForm"
,那么您可以执行以下操作:
var model = $('#myForm').serialize();
答案 1 :(得分:1)
@using (Ajax.BeginForm("SaveDetails", "Media", new AjaxOptions { HttpMethod = "POST", OnSuccess = "AfterEntry()", OnBegin="ValidateForm()"}, new { id = "myForm" }))
它会做同样的事情,你会写我的外部
$.ajax({
url: '/Media/SaveDetails',
type: "POST",
data: {obj: $('#myForm').serialize() },
success: function (data) { AfterEntry(data) }
})
// 不需要dataType:'html'作为json
使用Ajax.BeginForm技术还可以对数据注释中提到的 model.mediaName 进行服务器端属性验证
例如
[Required(ErrorMessage = "Media Name is required")]
public string mediaName{ get; set; }
如果mediaName为空,则使用ajax.BeginForm将显示错误消息。 即 @ Html.ValidationMessageFor 将被解雇
如果您尝试执行相同操作但是通过外部Ajax ,则必须在jquery中编写额外的长验证,否则 @ Html.ValidationMessageFor 将不会被解雇< / p>