动作方法参数中的继承

时间:2013-01-25 09:52:49

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

我有以下课程:

class SomethingBase 
{
    public string SharedProperty { get; set; }
}

class ChildClassOne : SomethingBase 
{
    public string SpecificPropertyOne { get; set; }
}

class ChildClassTwo : SomethingBase 
{
    public string SpecificPropertyTwo { get; set; }
}

我有ASP.NET MVC View,它有两个HTML表单。这些表单调用相同的操作方法。 此操作方法应该接收两个SomethingBase类派生中的任何一个。 但是,如果我创建单个参数,例如SomethingBase param,则只会收到SharedProperty。这种行为可以通过ASP.NET MVC的绑定机制来解释。

为了使我的动作方法有效,我创建了下一个定义:

public ActionResult(ChildClassOne param1, ChildClassTwo param2)

SharedProperty转到两个参数,但仅为对象填充特定属性,该对象实际上是从视图传递的。它有效,但我不认为这是唯一的解决方案。

对于这种情况,是否有一些最佳实践解决方案?

2 个答案:

答案 0 :(得分:1)

您应该为每个操作创建一个视图模型,因为它们不相同。在这种情况下,没有理由尝试使用基类。

答案 1 :(得分:0)

TryUpdateModel类的方法Controller使其有效。但是,这种方式并不是很优雅。

...
public ActionResult Save(FormCollection collection)
        {
            SomethingBase model = null;
            if (collection.AllKeys.Contains("SpecificOne"))
            {
                model = new ChildOne();
                TryUpdateModel<ChildOne>((ChildOne)model, collection);
            }
            else
            {
                model = new ChildTwo();
                TryUpdateModel<ChildTwo>((ChildTwo)model, collection);
            }
...