强类型的ASP.NET MVC ViewData扩展 - 放置标识符的位置?

时间:2009-01-23 19:18:07

标签: c# asp.net-mvc

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

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

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

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

  4. 所以,我正在考虑使用幻像类型来组合类型和密钥标识符。它等同于这个伪的C#:

    class ViewDataKey<T> = string
    

    这样我就可以在控制器中创建标识符,如下所示:

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

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

      ViewData.Set(IsNew, true);
    

    获取它同样容易:

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

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

    问题:

    1. 密钥应存放在何处?对于“global-ish”ViewData,一些常见的类可以正常工作。但对于View / Controller特定数据?将它放在控制器上是否有任何缺点? (除了控制器的长名称?)

    2. 是否有更简单的方法或内置的东西?

4 个答案:

答案 0 :(得分:2)

我认为这就是模型在MVC模式中的作用。为什么不使用打字视图呢?

我相信你只是通过在控制器和视图之间引入另一个依赖项来使事情变得更复杂。我没有看到代码行或类似的任何特定好处。您必须声明变量的存在,您还要在模型类定义中执行该变量。

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

答案 1 :(得分:2)

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

class SimpleModel<T>

class SimpleModel<T, U>

class SimpleModel<T, U, V>

然后像往常一样制作强类型视图。现在,您可以获得强大打字的优势,而无需为每个案例创建新课程。

.NET 4.0内置了Tuple等。

答案 2 :(得分:0)

我仍然使用ViewData字典,而不是“把它扔出去”,我只是使用ToString()和Html.Encode它。为什么打破MVC模式?

答案 3 :(得分:0)

我刚刚张贴了一篇涉及此主题的帖子。

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

希望它有用。

此致

托比