更改操作参数数据类型时,MVC模型绑定给出错误的结果

时间:2018-09-26 08:15:26

标签: c# asp.net-mvc model-binding

在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参数?

1 个答案:

答案 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);
    }