如何将MVC ViewModel中的输入数据转换为ajax文章



我正在将SQL数据库表中的数据提取到ASP.NET MVC Razor视图中,但在将更改后的输入数据提取到Ajax帖子中时遇到了问题,例如:

@model MyViewModel
<div class="row">
<div class="col-1">
@Html.LabelFor(model => model.Id, "Id:", new {})
</div>
<div class="col-4">
@Html.Label(Model.Id.ToString(), new { title = "" })
</div>
</div>
<div class="row">
<div class="col-1">
@Html.LabelFor(model => model.Test, "Test:", new { })
</div>
<div class="col-9">
@Html.TextBoxFor(model => model.Test, new { data_bind = "value: Test", @type = "text" })
</div>
</div>
@section scripts {
<script type="text/javascript">
$("#save-click").click(function () {
var nr = @Model.Id;
var postData = @Html.Raw(Json.Encode(@Model));
//alert(postData.Test);
$.ajax({
type: "POST",
url: actions.test.createOrUpdate + "?id=" + nr,
dataType: "json",
traditional: true,
data: postData,
success: function (response) {
if (response.Code == 0) {
else {
window.location.reload(false);
}
} else {
alert('err');
}
}
});
});
});
</script>
}

加载视图时,所有内容都会正确显示。控制器动作被正确触发,Id(不能更改(也被正确传递。然而,当输入字段发生更改时,更改后的值不会传递给控制器,而是传递给视图中获取的原始值。

序列化似乎有效,因为警报(postData.Test(返回一个值,但始终是不变的值。

如有任何帮助,我们将不胜感激。

var postData = @Html.Raw(Json.Encode(@Model));

这句台词是罪魁祸首。当Razor渲染脚本时,它会将原始/未更改的模型分配给postData变量。

如果您使用"Inspect Element"或开发工具来检查postData的值,您会发现这些值不会改变,因为它们是静态分配的。

每次使用点击按钮时,您需要检查新值

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

请确保将您的输入字段包装在表单标记中。参见以下代码:

<form>
<div class="row">
<div class="col-1">
@Html.LabelFor(model => model.Id, "Id:", new {})
</div>
<div class="col-4">
@Html.Label(Model.Id.ToString(), new { title = "" })
</div>
</div>
<div class="row">
<div class="col-1">
@Html.LabelFor(model => model.Test, "Test:", new { })
</div>
<div class="col-9">
@Html.TextBoxFor(model => model.Test, new { data_bind = "value: Test", @type = "text" })
</div>
</div>
</form>
@section scripts {
<script type="text/javascript">
$("#save-click").click(function () {
var nr = @Model.Id;
// use form.serialize or use the id/class of your form
var postData = $("form").serialize();
$.ajax({
type: "POST",
url: actions.test.createOrUpdate + "?id=" + nr,
dataType: "json",
traditional: true,
data: postData,
success: function (response) {
if (response.Code == 0) {
else {
window.location.reload(false);
}
} else {
alert('err');
}
}
});
});
});
</script>
}

最新更新