2010-09-12 39 views
3

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值会做什么?

回答

0

最后我创造了一些东西来做到这一点。根据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; 
    } 
} 
3

嗯,有做这将是实现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对象添加到任何行动据我所知,它会尝试为你绑定它

+1

是的,我考虑过它,但正在寻找一种不需要自定义模型绑定的解决方案。在很多情况下,这将是最好的解决方案。 – ongle 2010-09-13 15:37:24

+0

我强烈建议采用这种方法。 CustomModel是一个漂亮的方法。 – 2015-01-02 12:15:41