1

将自定义属性添加到侧宽 ViewDataDictionary 的最实用方法是什么?

让我们假设一个简单的案例:

public ActionResult Index()
{
  // ViewData["Title"] = "Home";
  ViewData.Title = "Home";
  return View();
}

首先想到的是一个自定义类并在应用程序基础控制器中使用“new”:

public class CustomDataDictionary : ViewDataDictionary
{
  public string Title { get; set; }
}

public class ApplicationController : Controller
{
    public new CustomDataDictionary ViewData { get; set;} 
}

我假设您还必须创建一个具有相同属性的相应 CustomViewPage 才能在视图中使用自定义视图数据字典。

想到的第二件事是创建一个 ViewDataDictionaryExtensions 类。

第三,使用“视图模型”。我对 View Models 的不满是总是创建一个并将其传递给 View 似乎在控制器代码中一遍又一遍地重复自己,至少与前两个选项相比。

真正的目标是每个应用程序可能在 ViewData 中有一组核心属性,这些属性对于该应用程序的目的是有意义的。我倾向于回避依赖字典键,如果有真正的属性让其他开发人员依赖一个来知道要设置什么数据,那就太好了。此外,键很容易拼写错误。

这三种方法都能完成工作。别人做了什么?

4

3 回答 3

0

重新命名拼写错误的问题 - 这就是常量的用途。

为了ViewData正确输入,您需要继承等;因此,当您完成此操作时,我想知道您是否不能轻松地将一些通用代码添加到设置密钥的控制器中。

至少对我来说,使用密钥似乎是最不复杂的答案 - 这也适用于最广泛的情况(即某些代码只知道基本的IDictionary<string,object>)。

您可能也对这个相关问题感兴趣。

于 2009-04-17T08:58:31.960 回答
0

所有这些听起来都行得通。我认为您选择哪一个取决于您的要求/需求。(真的是独一无二且内容丰富的答案,嗯?)

你的问题是“其他人做了什么?” 尽管。因此,如果您正在轮询,最近将常量方法用于较小的应用程序。我还没有做过企业 MVC 应用程序,但我想我可能会创建一个继承 Controller 并定义这些额外属性的基类。如果我想将这些一致地传递给视图,我同样会为我的模型创建一个基类。然而,这必须谨慎使用——即使你正式输入它们,它们的行为仍然很像全局变量。所以你当然要小心。

于 2009-05-03T13:08:45.567 回答
0

最后,至少对于这个应用程序,我选择了一个基本的 AppViewModel 类。Controller.OnActionExecute/ed 查看 ViewData.Model 是否已设置,如果未设置,则将 AppViewModel 的实例放置在其位置,以便所有页面都有一个一致的模型可以使用(Model.Title、Model.IsAuthenticated、Model .用户等)

然后更详细的控制器操作有一个 AppModelView 的子类,它可以在操作本身中手动设置为 ViewData.Model,也可以通过属性在 OnExecute/ed 中设置。

根本没有太多代码,但它不会在所有控制器操作中重复相同的旧创建/设置代码。对我来说,它将视图数据保存为一个包,而不是弄乱 Controller api。

于 2009-05-04T17:44:36.660 回答