2

我是 MVC 的新手,我遇到了一个问题。

阅读 Stephen Walters 的博客(请参阅此处),我看到 MVC 操作参数尝试匹配 HttpRequest 对象(查询字符串、表单、Cookie 和服务器变量)中的数据。他的示例显示了一个获得 2 个值的标准操作:

public ActionResult Index(string HTTP_USER_AGENT, string myCookie)
{
    ViewData["HTTP_USER_AGENT"] = HTTP_USER_AGENT;
    ViewData["myCookie"] = myCookie;
    return View();
}

这应该获取 HTTP_USER_AGENT 和 cookie (myCookie) 的值(如果存在)。

但是,当我尝试运行此示例时,两个 params = null !

如果我尝试,cookie 存在(我之前创建过):

string c = Request.Cookies["myCookie"].Value;

它有我期待的价值!更令人费解的是 HTTP_USER_AGENT 为空

有任何想法吗???

谢谢!!!

4

3 回答 3

1

MVC 3 及更高版本包含 4 个集合的默认值提供程序:

Form, RouteData,QueryStringFile.

Cookie 和服务器变量没有值提供程序。但似乎您可以为这些集合编写自己的价值提供者。

Cookie 示例:

public class CookieValueProviderFactory : ValueProviderFactory
{
    public class CookieValueProvider : IValueProvider
    {
        private readonly HttpCookieCollection _cookies;

        public CookieValueProvider(HttpCookieCollection cookies)
        {
            _cookies = cookies;
        }

        public bool ContainsPrefix(string prefix)
        {
            return _cookies.AllKeys.Any(x => x.Contains(prefix));
        }

        public ValueProviderResult GetValue(string key)
        {
            if (_cookies == null)
            {
                return null;
            }

            var val = _cookies[key] == null ? null : _cookies[key].ToString();
            var val = _cookies[key];
            return val != null
                       ? new ValueProviderResult(val, val.ToString(), CultureInfo.CurrentCulture)
                       : null;
        }
    }

    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        return new CookieValueProvider(controllerContext.HttpContext.Request.Cookies);
    }
}

并在 global.asax 中注册:

protected void Application_Start()
{
        ...

    ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
    RegisterRoutes(...)
}
于 2013-05-24T15:03:44.937 回答
0

那篇博客文章来自 2008 年,即 MVC1/MVC2 时代。根据文章底部关于这样做的不良安全影响的一些评论,我认为他们在 MVC3 和 MVC4 中删除了此功能。

于 2013-05-24T14:53:23.957 回答
0

您可以查看源代码ValueProviderFactories.cs并查看列出的这些值提供程序:

public static class ValueProviderFactories
{
    private static readonly ValueProviderFactoryCollection _factories = new ValueProviderFactoryCollection()
    {
        new ChildActionValueProviderFactory(),
        new FormValueProviderFactory(),
        new JsonValueProviderFactory(),
        new RouteDataValueProviderFactory(),
        new QueryStringValueProviderFactory(),
        new HttpFileCollectionValueProviderFactory(),
    };

    public static ValueProviderFactoryCollection Factories
    {
        get { return _factories; }
    }
}

看起来没有 cookie 值提供者或服务器变量提供者。

于 2013-05-24T15:04:25.220 回答