繁体   English   中英

为 ASP.NET MVC 视图准备模型

[英]Preparing models for ASP.NET MVC views

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

    //
    // 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 ..初始化。但迟早我们会得到重复的代码块,引用类型属性被遗漏等等。我也不认为这是一个好的编码实践。

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

更新:

因为回复有点错过了重点(它们不会让我们以任何方式思考模型,并且需要在 model 类中添加额外的代码),我在想这个选项是否可行:

  1. 使用自定义动作过滤器,
  2. 覆盖OnActionExecuted()
  3. 在此方法中使用反射从 Model 中取出 object 并枚举其公共属性并尝试对其进行初始化。

我已经部分实施了步骤 1、2 和 3,但我无法弄清楚如何执行“... = new Client();” 以编程方式使用反射。

使您的 model 的属性返回一个新实例,如果它是 null

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

    return client;
  }
}

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

我不确定我是否完全理解你的问题。 你想要什么自动化? 视图模型和视图? 您是否正在创建强类型视图?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM