为什么我的Controller没有填充Action Params?

时间:2013-05-24 14:41:37

标签: c# asp.net asp.net-mvc cookies

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

阅读Stephen Walters的博客(参见HERE),我看到MVC Action Params尝试匹配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为空

任何想法???

感谢!!!

3 个答案:

答案 0 :(得分:1)

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

FormRouteDataQueryStringFile

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(...)
}

答案 1 :(得分:0)

那篇博客文章是从2008年开始的MVC1 / MVC2时代。根据文章底部关于这样做的不良安全隐患的一些评论,我认为他们在MVC3和MVC4中删除了这种能力。

答案 2 :(得分: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值提供者或服务器变量提供者。