2017-10-14 92 views
0

我想通过AJAX实现一些保存功能。我有一个类似下面定义控制模式,从模型中填充的观点:在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,但我有从控制访问的“已建成”模型问题......

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

好了,所以我想....你想打控制器动作SaveDetails ...为什么没有t使用Ajax表单...通过ajax提交数据并且不执行任何回发...将代码放在答案中 –

回答

1

由于形式加入AJAX之前正常工作,想必你有一个<form>包围输入元素?如果是这样,您可以序列化该表单。因此,举例来说,假设你的窗体有id="myForm",那么你可以做这样的事情:

var model = $('#myForm').serialize(); 
+0

将被接受为控制器中的Medium类吗? (刚刚编辑了显示控制器操作的问题) –

+0

@ byle.05:它*应该*,因为它提交的是与普通表单文章相同的表单键/值对。你也可以试着摆脱那个'model'变量并直接序列化到'data'属性:'data:$('#myForm')。serialize(),'只要POST请求匹配,AJAX或者其他,模型联编程序将能够创建模型。检查浏览器开发工具中的请求(特别是在“网络”选项卡上),查看它们是否有区别。 – David

+0

对不起,延迟回复...我试过这种方式,我能够将值传递给控制器​​,但转换是不可能的。控制器正在接收一个字符串:'“mediaName = Pulp +++++++++ AA ++++ Fiction&idMediaType = MOVIE”'但这看起来不能转换为模型实体。另外loks查询字符串格式,用+替换空格。也许我的表单被错误地定义了? :'

' –

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

使用ajax.BeginForm将显示​​一条消息错误,如果MEDIANAME是空白.. 即@ Html.ValidationMessageFor将被解雇

你将不得不写在jQuery的超长验证,如果你试图做相同的,但通过外部阿贾克斯否则@ Html.ValidationMessageFor不会被解雇

+0

感谢您的回答Rohitas。主要是寻找如何发送数据到控制器和JSON'form.serializeArray()'是关键。谢谢;) –