有没有一种方法可以通过JavaScript更新MVC 5 ViewModel

时间:2020-03-05 02:30:27

标签: javascript jquery asp.net-mvc

我有一个MVC 5 ViewModel,我正在尝试通过使用隐藏字段进行更新,如下所示:

 @Html.HiddenFor(m => m.ModelAction, new { Value = "New" })

我运行了以下JavaScript语句进行测试,以查看是否可以更新ViewModel,但没有更新。隐藏字段确实会更新,但不会更新其绑定的模型属性ModelAction。 ViewModel属性ModelAction最初设置为“ New”,并且当隐藏字段设置为“ Browse”时,应该将其更新为“ Browse”,但这不会发生:

$('#ModelAction').val("Browse"); //set value in hidden field
var modelActionFromHtml = $('#ModelAction').val(); //check if hidden field value was set
var viewModel = @Html.Raw(Json.Encode(Model)); //load Model 
var modelActionFromViewModel = viewModel.ModelAction; //check if value in model updated

我认为ViewModel是在2个方向上绑定的数据,因此对View字段的更新将更新模型,但这在上面的测试中没有发生。有什么方法可以从JavaScript更新ViewModel吗?

1 个答案:

答案 0 :(得分:0)

这不会提供更新的模型,因为@ Html.Raw(Json.Encode(Model))是在html的服务器端呈现期间完成的。

var viewModel = @Html.Raw(Json.Encode(Model)); //load Model 
var modelActionFromViewModel = viewModel.ModelAction; //check if value in model updated

因此,在运行这些脚本之前,var viewModel已经具有一个值,它是控制器中的新值,因为它是刚刚呈现的。


您可能需要做的是通过使用$(formElement).serialize()并通过JSON.Stringify()将其转换为json来实现客户端等效; 确保将您的元素放在表单标签中。

$(document).ready(function(){
   $('#ModelAction').val("Browse"); //set value in hidden field
   var modelActionFromHtml = $('#ModelAction').val();

   var viewModel = var data = JSON.stringify($("form").serializeArray());
   console.log(viewModel);
});