在MVC应用程序中,在与模型类相似的行上有一个 model 类和一个 viewmodel 类(代码在下面给出)。有一个视图的模型为“ viewmodel”及其形式。此表单提交按钮的相应操作方法具有操作参数作为viewmodel类。在提到这种情况下,模型绑定可以正常工作。 现在,如果我将Action方法的数据类型从“ viewmodel”更改为“ Model”类,则模型绑定将无法正确工作,并且服务器端将无法接收到正确的数据。下面是模型类-
public class Model
{
public int A { get; set; }
}
public class ViewModel
{
public Model Model { get; set; }
}
查看文件代码如下:
@model ViewModel
@{
ViewBag.Title = "Test";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>
@using (Html.BeginForm("A", "Customers"))
{
<div class="form-group">
@Html.LabelFor(m => m.Model.A)
@Html.TextBoxFor(m => m.Model.A, new { @class="form-control" })
</div>
<button type="submit" class="btn btn-primary">Save</button>
}
控制器操作方法: 具有正确的模型绑定行为-
public ActionResult A(ViewModel model)
{
return Content("Value of A is " + model.Model.A);
}
如果将action参数更改为Model class,则不会发生模型绑定行为。下面是代码-
public ActionResult A(Model model)
{
return Content("Value of A is " + model.A);
}
为什么会这样?
在浏览器端,表单数据为- 型号A-1 为什么在第二种情况下不能将此值绑定到Model Class A参数?
答案 0 :(得分:1)
由于视图是通过 ViewModel 类(模型绑定)绑定的,因此它在发布事件中将相同的模型传送到服务器。但是如果您想与其他模型绑定,则必须像服务器端模型一样在客户端上形成新模型。
要实现您的期望,请遵循以下代码:
<input type="button" value="Save" onclick="SaveData()"/>
<script>
function SaveData() {
$.ajax({
url: "/Home/Save",
dataType: "json",
type: "Post",
data: {
model:{A:10}
},
success:function(data) {
}
});
}
</script>
请在客户端和服务器端保留相同的变量名。
public ActionResult Save(Model model)
{
return Content("Value of A is " + model.A);
}