我有一个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吗?
答案 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);
});