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

C# 当操作参数数据类型更改时,MVC模型绑定给出错误的结果,c#,asp.net-mvc,model-binding,C#,Asp.net Mvc,Model Binding,我有一个模型类和一个viewmodel类,它们与MVC应用程序中的模型类(下面给出了代码)类似。有一个视图的模型是“viewmodel”,它是一个表单。此表单提交按钮的相应操作方法的操作参数为viewmodel类。提到这个场景后,模型绑定工作得很好。 现在,如果我将Action方法的数据类型从“viewmodel”更改为“Model”类,那么模型绑定将无法准确工作,服务器端也不会收到正确的数据。以下是模型课程- public class Model { public int A {

我有一个模型类和一个viewmodel类,它们与MVC应用程序中的模型类(下面给出了代码)类似。有一个视图的模型是“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>
}
如果我将action参数更改为Model类,则不会发生模型绑定行为。以下是守则-

public ActionResult A(Model model)
        {
            return Content("Value of A is " + model.A); 
        }
为什么会这样

在浏览器端,表单数据如下所示: 模型A-1
为什么在第二种情况下,该值不能绑定到模型类A参数?

因为您的视图绑定到了ViewModel类(模型绑定),所以它将post事件中的相同模型传输到服务器。但是,如果您想与其他模型绑定,那么您必须在客户端形成新的模型,就像您的服务器端模型一样

在您的情况下,要实现您想要的目标,请遵循以下代码:

 <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>

由于您基于
ViewModel
而不是
Model
生成
name
属性,因此POST方法中的参数必须匹配(或者您可以使用
[Bind(Prefix=“Model”)]
属性)。作为旁注,视图模型不包含数据模型-它们包含您在视图中需要的数据模型的属性-引用我可能误解了一些内容,但您是否可以将其更改为@model model?您想将其嵌套在ViewModel中有什么原因吗?@velsietis-我只想在视图文件中使用ViewModel。视图模型允许添加更多属性,并且可以使用复杂的类类型,而不仅仅是模型类。我在问题中提出的只是问题的一个主要方面。在实际场景中,我的ViewModel类中有许多其他属性。@SunilA那么听起来像是绑定前缀(正如Stephen Muecke所建议的)就是您需要的need@StephenMuecke-成功了。
 <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);
    }