使用ajax传递复杂对象MVC
问题描述:
我有多个部分的视图。我想单独使用部分视图和ajax更新部分。使用ajax传递复杂对象MVC
我有这个至今:
控制器:
[HttpPost]
public PartialViewResult userdetailssettings(UserDetails model)
{ .... }
查看HTML:
<div id="userDetailsPartial">
@Html.Partial("_user_details", Model.userdetails)
</div>
部分HTML:
<div class="form-group">
<div class="col-md-12">
@Html.TextBoxFor(x => x.Forename, new { @class = "form-control", placeholder = "Enter your forename" })
@Html.ValidationMessageFor(x => x.Forename)
</div>
</div>
<div class="form-group">
<div class="col-md-12">
@Html.TextBoxFor(x => x.Surname, new { @class = "form-control", placeholder = "Enter your surname" })
@Html.ValidationMessageFor(x => x.Surname)
</div>
</div>
的Javascript上查看:
var detailsUrl = "@Url.Action("userdetailssettings", "UserLogin")";
var detailsmodel = JSON.stringify(@Html.Raw(Json.Encode(@Model.userdetails)));
$(document).on('click touchstart', '#saveDetails', function() {
$.ajax({
type: "POST",
dataType: 'json',
data: detailsmodel,
url: detailsUrl,
contentType: "application/json"
}).done(function (res) {
$("#userDetailsPartial").html(res);
addresssearch();
});
});
该模型由ajax传递给控制器,但值不是输入的值。它们是从控制器传递来打开视图的原始值。
我试过在标签中包装部分,并尝试在部分内添加表单标签。
我也试图把这个代码:
var detailsUrl = "@Url.Action("userdetailssettings", "UserLogin")";
var detailsmodel = JSON.stringify(@Html.Raw(Json.Encode(@Model.userdetails)));
里面的点击功能。
我不会传递输入中的更新值。
我曾经想过在JavaScript即
var detailsmodel = [ { Forename: $('#Forename').val(), Surname: $('#Surname').val() } ];
从输入创建模型的新实例,但如果我只是创造JSON为什么我不能只是绑定模型转换成JSON。
答
为什么我不只是转换绑定模型JSON
这是因为你使用MVC,不MVVM。
“绑定模型”是通过模型从控制器到视图的一种方式;有可能将“绑定模型”与“模型”和“绑定”混合在一起。
如果你发布表单,你会在Action中获得模型(当然是基于参数),但是如果你通过ajax传递,你需要从表单获取当前值(就像你的评论“从输入中创建模型的新实例”)。
可以生成数据经由AJAX以各种方式,如通过:
var data = $("form").serialize();
而不是手动添加每个输入。
var detailsmodel = JSON.stringify...
在生成视图时设置,并且不会使用MVC自动更改。
答
这是因为您传递的数据是基于@Html.Raw(Json.Encode(@Model.userdetails))
在页面加载时静态设置的。
您需要使用诸如$form.serialize()
之类的东西,否则就会从页面上的实际字段中创建帖子正文。
*“为什么我不能只将绑定模型转换为json” - 因为您使用的是MVC而不是MVVM。您的“绑定模型”是通过模型从控制器到视图的一种方式。您将“绑定模型”与“模型”和“绑定”混合在一起。如果你发布表单,你会得到模型,但是如果你通过ajax传递,你需要从表单中获取当前值(就像你的评论'从输入创建模型的新实例'一样)。你的'var detailsmodel = JSON.stringify ...'是在视图生成时设置的,并且不会改变。 –
谢谢你的解释。我将吞噬创建模型的新实例。如果你给你的评论一个答案,我会接受。再次感谢。 –