在 ASP.NET MVC 中通过 AJAX 创建并发送整个模型

Create and send whole model via AJAX in ASP.NET MVC

我正在尝试通过 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" })

当用户修改数据并单击保存按钮时,视图能够从这些控件构建新数据并将其发送到控制器(它只是将模型保存到数据库)。

我正在尝试做同样的事情,但是通过 AJAX 但是我在从控件访问 "already-built" 模型时遇到问题...

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);
}

由于表单在添加 AJAX 之前工作正常,大概您有一个 <form> 包含输入元素?如果是这样,您可以序列化该表单。因此,例如,假设您的表单有 id="myForm",那么您可以这样做:

var model = $('#myForm').serialize();
 @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不会被解雇