如何覆盖属性绑定名称?

时间:2015-09-21 17:35:40

标签: asp.net-mvc data-binding

我有两个相同字段的模型:

class Model1 
{
    int Prop1 { get; set; }
    int Prop2 { get; set; }
}

class Model2
{
    int Prop1 { get; set; }
    int Prop2 { get; set; }
}

和主要模型:

class MainModel
{
    Model1 P1 { get; set; }
    Model2 P2 { get; set; }
}

我想为View创建MainModel,但不知道绑定数据是什么。

放入视图:

@Html.EditorFor(model => model.P1.Prop1 ... ) // first editor Prop1, for P1
@Html.EditorFor(model => model.P2.Prop1 ... ) // second editor Prop1, for P2

但控制器操作仅从第一个Prop1编辑器获取值,对于model1和model2,model2值必须从第二个编辑器获取;动作:

ActionResult Create([Bind(Include = "Prop1, Prop2")] Model1 model1,[Bind(Include = "Prop1, Prop2")] Model2 model2)
{
}

model2.Prop1值实际上是model1.Prop1值。

具有匹配名称的正确绑定字段是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用MainModel作为操作参数:

ActionResult Create(MainModel model)
{
}

或者您可以将参数名称与主类属性名称匹配:

ActionResult Create(Model1 p1, Model2 p2)
{
}

答案 1 :(得分:0)

model2.Prop1值实际上是model1.Prop1值。不是。

根本没有任何约束,因为您的属性名称与视图中的生成名称不匹配。您的所有属性值均为0int的默认值)

您的方法必须是

public ActionResult Create(MainModel model)

public ActionResult Create([Bind(Prefix = "P1")]Model1 model1, [Bind(Prefix = "P2")]Model2 model2)

Prefix BindAttribute属性从提交的表单值中删除前缀,以便P1.Prop1变为Prop以进行绑定