2010-09-12 88 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