Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 如何将用户首选项传递到MVC4中的每个视图,而无需手动将其添加到我的数百个viewmodels中_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 4 如何将用户首选项传递到MVC4中的每个视图,而无需手动将其添加到我的数百个viewmodels中

Asp.net mvc 4 如何将用户首选项传递到MVC4中的每个视图,而无需手动将其添加到我的数百个viewmodels中,asp.net-mvc-4,Asp.net Mvc 4,我为用户存储了首选项(日期格式、语言、货币符号等)。 现在,在我的视图中,我需要使用这些首选项来显示日期或使用正确的符号显示货币 问题是,由于我有数百个viewmodels(实际上是models和viewmodels的混合体),为了在我的视图中有这个preferences对象,我需要在每个VM中添加一个属性,并在控制器中加载该属性。这会管用,但有点臭 我想让我的所有ViewModel都继承自一个可以设置preferences属性的BaseViewModel。这将帮助我定义一次属性,但一旦VM实例

我为用户存储了首选项(日期格式、语言、货币符号等)。 现在,在我的视图中,我需要使用这些首选项来显示日期或使用正确的符号显示货币

问题是,由于我有数百个viewmodels(实际上是models和viewmodels的混合体),为了在我的视图中有这个preferences对象,我需要在每个VM中添加一个属性,并在控制器中加载该属性。这会管用,但有点臭

我想让我的所有ViewModel都继承自一个可以设置preferences属性的
BaseViewModel
。这将帮助我定义一次属性,但一旦VM实例化,我仍然需要在每个控制器的操作中加载它

那么,我应该如何避免这种情况并在所有视图中访问首选项?


这可能是对
ViewData
的一个很好的使用,并且在动作过滤器中“注入”了
首选项
对象?

好吧,我最终以这种方式创建了一个动作过滤器:

public class IncludePreferencesAttribute : ActionFilterAttribute
{       
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
        var controller = filterContext.Controller as MyBaseController;

        if (controller != null)
        {
           controller.ViewBag.MyPref = controller.GetUserPreferences();
        }
    }
}
在控制器操作中,我需要使用首选项,我用
[IncludePreferences]
修饰它

然后,在我看来:

@{
   var pref = ViewBag.MyPref as MyPreferences;
}

这样,我就不需要更改ViewModels,只需在需要首选项的操作上加载它。

操作过滤器可能是最好的方法。Viewbag或ViewData,无论哪种方式。。。