为ASP.NET MVC视图准备模型

时间:2011-05-04 14:16:15

标签: c# asp.net-mvc reflection asp.net-mvc-3

当为创建和编辑等视图返回强类型模型时(当我们编辑的对象的验证失败时),我通常会准备这样的模型:

    //
    // GET: /Invoice/Create
    public virtual ActionResult Create()
    {
        // prepare the empty model
        Invoice model = new Invoice();
        model.Client = new Client();
        model.Client.PostCode = new PostCode();
        return View(model);
    }

    //
    // POST: /Invoice/Create
    [HttpPost]
    public virtual ActionResult Create(Invoice document,
                                       FormCollection collection)
    {

        // check for errors
        if (!ViewData.ModelState.IsValid)
        {
            document.Client = new Client();
            document.Client.PostCode = new PostCode();
            return View(document);
        }

现在我知道其他人也是这样做的,事实上你可以在MVC Music Store样本中看到同样的方法。但是,这非常容易出错,因为可能会意外地遗漏了视图中所需的引用实体。它还需要过多考虑视图/模型交互。我想要的是某种自动化。模型中的值类型属性通常不是问题,因为它们默认为零或空字符串。然而,引用类型应该用new初始化..但迟早我们最终会得到重复的代码块,遗漏引用类型属性等等。我不认为这是好的编码实践

我们可以采取哪些其他选择?

更新

因为回复有点遗漏了这一点(他们没有放心我们以任何方式思考模型并需要模型类中的其他代码),我在想这个选项是否有效:

  1. 使用自定义操作过滤器,
  2. 覆盖OnActionExecuted()
  3. 在此方法中使用Reflection从模型中取出对象并枚举其公共属性并尝试初始化它们。
  4. 我已经部分实施了步骤1,2和3但我无法弄清楚如何做“... = new Client();”用反射编程。

3 个答案:

答案 0 :(得分:1)

如果模型的属性为null,则使其返回一个新实例

private Client client;
public Client Client
{
  get
  {
    if (client == null)
      client = new Client();

    return client;
  }
}

答案 1 :(得分:1)

我建议您使用绑定到ViewModel的强类型视图,该视图与您尝试创建的域模型不同,并将任何必要的逻辑放入ViewModel的构造函数中

答案 2 :(得分:0)

我不确定我完全理解你的问题。你想要什么自动化? ViewModels和Views?你在创建强类型视图吗?

我创建了一个T4模板,我指向一个数据库,它为每个表生成一个ViewModel。外键变为下拉列表,长字符串获取TextArea而不是TextBox等。然后删除我不需要的那些并修改我想要保留的那些。这不是一个完全自动化的过程,但它可以完成80%到90%的工作,具体取决于项目。

然后我从那些ViewModel生成强类型视图。

听起来您可能对AutoMapper感兴趣。