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