我是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为空
任何想法???
感谢!!!
答案 0 :(得分:1)
MVC 3及更高版本包含4个集合的默认值提供程序:
Form
,RouteData
,QueryString
和File
。
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值提供者或服务器变量提供者。