【问题标题】:Strongly typed ASP.NET MVC ViewData extensions - where to put identifiers?强类型 ASP.NET MVC ViewData 扩展 - 在哪里放置标识符?
【发布时间】:2009-01-23 19:18:06
【问题描述】:

有时创建新模型类型的开销很烦人。在这些情况下,我想设置 ViewData,选项似乎是:

  1. 只需使用字符串键设置 viewdata,然后将其丢弃。这有明显的问题。

  2. 将标识符(字符串键)存储在某处(在哪里?在控制器上?)并将其投射到视图页面上。在解决其中一个问题的同时,我仍在强制转换,这是有问题的,并且会扼杀类型推断。

  3. 使用 MVCContrib 强类型 Set/Get 函数。这些有时很好,但如果类型不是很具有描述性,比如布尔值“IsNew”,它们就不能很好地工作。它还扼杀了类型推断,而且它仍然只是在进行强制转换,所以我必须手动同步视图和控制器。

所以,我正在考虑使用幻像类型来组合类型和键标识符。它相当于这个伪 C#:

class ViewDataKey<T> = string

这让我可以像这样在控制器中创建标识符:

public static readonly ViewDataKey<bool> IsNew = "IsNew";

使用一些简单的扩展方法,设置数据将是:

  ViewData.Set(IsNew, true);

取出它同样简单:

var isNew = ViewData.Get(FrobNozzleController.IsNew);

请注意,我们不需要指定 isNew 的类型,它是安全推断的。键和类型定义存储在一个位置。

问题:

  1. 密钥应该存储在哪里?对于“全球性”的 ViewData,一些常见的类可以正常工作。但是对于视图/控制器特定的数据?把它放在控制器上有什么缺点吗? (除了控制器的长名称?)

  2. 有没有更简单的方法,或者已经内置的东西?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    我认为这就是模型在 MVC 模式中所做的事情。为什么不使用类型化视图?

    我相信你只是通过在控制器和视图之间引入另一个依赖关系使事情变得更复杂。在代码行或类似的方面,我没有看到任何具体的好处。您必须声明变量的存在,您也可以在模型类定义中这样做。

    这样做你并没有获得任何显着的优势。

    【讨论】:

    • 你当然是对的。只是有时,在这里和那里添加简单的标志似乎是额外的工作。也许它们甚至是可选的(ViewDataKey 可以轻松存储默认值。)只是为每个视图创建一个新模型似乎有很多开销。
    【解决方案2】:

    一个想法是在您不想创建特定视图模型类的情况下为强类型视图创建元组:

    class SimpleModel<T>
    
    class SimpleModel<T, U>
    
    class SimpleModel<T, U, V>
    

    然后像往常一样创建一个强类型视图。现在,您无需为每种情况都创建一个新类,即可获得强类型的优势。

    .NET 4.0 内置了 Tuple 等。

    【讨论】:

    • 元组可以处理一些非常简单的事情,但假设你有“IsNew”、“ShowFrobNozzleSelector”等——所有布尔值......
    • @michaelgg 为什么这么害怕创建模型 - 需要两秒钟 - 即使是小东西?
    【解决方案3】:

    我仍然会使用 ViewData 字典,而不是“将其排除”,而是使用 ToString() 和 Html.Encode 它。为什么要打破 MVC 模式?

    【讨论】:

      【解决方案4】:

      我刚刚发布了一篇关于这个主题的帖子。

      http://agilefutures.com/index.php/2009/06/mvc-strongly-typed-global-viewdata

      希望有用。

      问候

      托比

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多