2009-04-17 86 views
1

将自定义属性添加到侧面ViewDataDictionary的最实用方法是什么?CustomViewData的最佳途径?

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

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

,想到的第一件事是在应用基础控制器的自定义类,并使用“新”:

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

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

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

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

第三,使用“查看模型”。 View Model的牛肉总是创建一个,然后将它传递给View,好像在控制器代码中一遍又一遍地重复自己,至少与之前的两个选项相比。

真正的目标是每个应用程序可能有一组核心的ViewData的有意义的所有应用目的性的。我倾向于回避依赖字典密钥,并且最好让其他开发人员拥有真正的属性来依靠它来知道要设置的数据。另外,钥匙很容易被拼错。

以上三种方法都可以完成工作。别人做了什么?

回答

0

最后,至少对于这个应用程序,我有一个基础的AppViewModel类。 Controller.OnActionExecute/ed查看ViewData.Model的设置,如果不是,则将AppViewModel的一个实例放在它的位置,以便所有页面都有一个一致的Model来处理(Model.Title,Model.IsAuthenticated,Model 。用户等)

随后更详细的控制器动作有AppModelView的子类,被设置为ViewData的。在动作本身中手动建模,或者通过属性在OnExecute/ed中设置。

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

0

重新命名拼写错误的问题 - 这是常数的问题。

对于ViewData进行适当的类型,你需要继承等;所以在你做完这些之后,我想知道你是否能够轻松地将一些通用代码添加到设置密钥的控制器中。

对我来说,至少对于我来说,最简单的答案似乎也适用于最广泛的情况(即某些代码只知道基本的IDictionary<string,object>)。

您还可能有兴趣在this related question

+0

”这就是常数。“ 听起来不错,直到你有大约50人。当你开始使用常量作为散列键名时,它会变得非常快。 扩展将是gret ...如果只有我们有扩展属性。获取/设置ala SmartBag不会告诉不熟悉的编码人员对解决问题的很多了解。 控制器方法可以,但你暗示他们是控制器的属性,这是不正确的。他们是action viewdata的属性。 – claco 2009-04-17 15:24:05

0

所有这些听起来像他们会工作。我想你选择哪一个取决于你的需求。 (真正独特和翔实的答案,对吧?)

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