ASP.NET MVC默认查看模型将Cookie绑定到自定义对象
问题描述:
ASP.NET MVC 2默认视图模型绑定是否支持将多值cookie绑定到自定义对象?在我编写自定义值提供程序之前,我想确保该功能不存在。ASP.NET MVC默认查看模型将Cookie绑定到自定义对象
因此给予相同的动作:
public ActionResult SomeAction(CustomObject foo)
其中CustomObject是一样的东西:
public class CustomObject
{
public string Name { get; set; }
public int Rank { get; set; }
}
和一个Cookie,就像是请求的一部分:
foo=Name=John&Rank=10
莫非我获取默认视图模型绑定来将cookie映射到参数,并对cookie的命名进行一些巧妙的调整或者像发布"foo.Name=John"
和"foo.Rank=10"
这样的cookie值会做什么?
答
最后我创造了一些东西来做到这一点。根据Mehdi Golchin发布的工作,我创建了一个允许这种绑定发生的值提供程序。
对于那些被捕的人,以下是我对上面链接的Mehdi作品的自定义更改。有关实施的完整详细信息,请参阅链接。这不支持绑定到嵌套对象(例如,Foo.Cell.X),因为我不需要那么复杂,但可以用一些递归来实现。
protected virtual bool ContainsPrefix(string prefix)
{
try
{
var parts = prefix.Split(new char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries);
switch (parts.Length)
{
case 0:
return false;
case 1:
return this._context.HttpContext.Request.Cookies.AllKeys.Contains(parts[0]);
default:
var cookie = this._context.HttpContext.Request.Cookies[parts[0]];
if (cookie == null) { return false; }
return cookie.Values.AllKeys.Contains(parts[1]);
}
}
catch (Exception ex)
{
ExceptionPolicy.HandleException(ex, "Controller Policy");
return false;
}
}
protected virtual ValueProviderResult GetValue(string key)
{
try
{
var parts = key.Split(new char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2) { return null; }
var cookie = this._context.HttpContext.Request.Cookies[parts[0]];
if (cookie == null) { return null; }
var value = cookie.Values[parts[1]];
if (value == null) { return null; }
return new ValueProviderResult(value, value, CultureInfo.CurrentCulture);
}
catch (Exception ex)
{
ExceptionPolicy.HandleException(ex, "Controller Policy");
return null;
}
}
答
嗯,有做这将是实现IModelBinder单程
public class CustomObjectModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
HttpCookie c = controllerContext.HttpContext.Request.Cookies["foo"]
CustomObject value = new CustomObject() {
foo.Name = c.Values["Name"],
foo.Rank = c.Values["Rank"]
}
return CustomObject
}
}
然后,只需添加到您的Application_Start()
ModelBinders.Binders.Add(typeof(CustomObject), new CustomObjectModelBinder());
可以cookie对象添加到任何行动据我所知,它会尝试为你绑定它
是的,我考虑过它,但正在寻找一种不需要自定义模型绑定的解决方案。在很多情况下,这将是最好的解决方案。 – ongle 2010-09-13 15:37:24
我强烈建议采用这种方法。 CustomModel是一个漂亮的方法。 – 2015-01-02 12:15:41