2

我对 OOP 和 C# 真的很陌生,我试图理解,我如何才能尽可能地编写我的代码。在我的 ASP.NET MVC 3 应用程序中,我在一个控制器中有多个操作(在此示例代码中为两个),它们都返回一个不同的ViewModel,它们都继承了相同的BaseViewModel. 这是因为我在每个动作上都需要相同的数据,但每个动作都有额外的属性。

我知道我可以简单地创建一个ActionOneViewModel接收ViewModel对象的构造函数。但这是常见的方法吗?或者有其他选择吗?

查看型号:

class BaseViewModel 
{
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public string PingPong { get; set; }
}

控制器动作:

public ActionResult ActionOne () 
{
    // this doesn't work (of course)
    ActionOneViewModel model = (ActionOneViewModel)createViewModel();
    model.FooBar = true;

    return View(model);
}

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    ActionTwoViewModel model = (ActionTwoViewModel)createViewModel();
    model.PingPong = "blub";

    return View(model);
}

private BaseViewModel createViewModel()
{
    BaseViewModel model = new BaseViewModel();

    //
    // doing a lot of stuff here
    //

    return model;
}
4

4 回答 4

3

怎么样:

ActionTwoViewModel model = new ActionTwoViewModel();
model = createViewModel(model);


private BaseViewModel createViewModel(BaseViewModel model)
{
    //
    // doing a lot of stuff here
    //

    return model;
}
于 2012-06-19T13:52:48.763 回答
3

您可以在方法或构造函数中执行此操作

有了那个,不需要特殊的“createViewModel”方法。

class BaseViewModel 
{
    public BaseViewModel() {
     //stuff here
     }
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base() {
         FooBar = fooBar;
    }
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public ActionTwoViewModel(string pingPong) :base() {
      PingPong = pingPong;
    }
    public string PingPong { get; set; }
}

用法

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    var model = new ActionTwoViewModel("blub");

    return View(model);
}
于 2012-06-19T13:55:17.747 回答
1

使用base(在 MSDN 上),您可以调用超类构造函数,然后为您的类添加您的东西。

public class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base()
    {
        //other stuff here
        model.FooBar = fooBar;
    }
}
于 2012-06-19T13:54:28.273 回答
1

有了一点通用性,这将起作用:

private T CreateViewModel<T>()
    where T : BaseViewModel, new()
{
    BaseViewModel model = new T();
    //doing a lot of stuff here
    return (T)model;
}

你可以像这样使用它:

ActionOneViewModel  model1 = CreateViewModel<ActionOneViewModel>();
ActionTwoViewModel  model2 = CreateViewModel<ActionTwoViewModel>();
于 2012-06-19T13:58:38.853 回答