2017-01-23 138 views
2

我有多个部分的视图。我想单独使用部分视图和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。

+0

*“为什么我不能只将绑定模型转换为json” - 因为您使用的是MVC而不是MVVM。您的“绑定模型”是通过模型从控制器到视图的一种方式。您将“绑定模型”与“模型”和“绑定”混合在一起。如果你发布表单,你会得到模型,但是如果你通过ajax传递,你需要从表单中获取当前值(就像你的评论'从输入创建模型的新实例'一样)。你的'var detailsmodel = JSON.stringify ...'是在视图生成时设置的,并且不会改变。 –

+0

谢谢你的解释。我将吞噬创建模型的新实例。如果你给你的评论一个答案,我会接受。再次感谢。 –

回答

3

为什么我不只是转换绑定模型JSON

这是因为你使用MVC,不MVVM。

“绑定模型”是通过模型从控制器到视图的一种方式;有可能将“绑定模型”与“模型”和“绑定”混合在一起。

如果你发布表单,你会在Action中获得模型(当然是基于参数),但是如果你通过ajax传递,你需要从表单获取当前值(就像你的评论“从输入中创建模型的新实例”)。

可以生成数据经由AJAX以各种方式,如通过:

var data = $("form").serialize(); 

而不是手动添加每个输入。

var detailsmodel = JSON.stringify...在生成视图时设置,并且不会使用MVC自动更改。

1

这是因为您传递的数据是基于@Html.Raw(Json.Encode(@Model.userdetails))在页面加载时静态设置的。

您需要使用诸如$form.serialize()之类的东西,否则就会从页面上的实际字段中创建帖子正文。