2012-06-25 2 views
1

У меня есть привязка модели класса I, и я хочу использовать выходное кэширование с ней. Я не могу найти способ, чтобы получить доступ к связанному объекту в GetVaryByCustomStringVaryByCustom и привязка к модели

Например:

public class MyClass 
{ 
    public string Id { get; set; } 
    ... More properties here 
} 

public class MyClassModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = new MyClass(); 
     ... build the class  
     return model; 
    } 
} 

Я поставил вяжущего в Global.cs

ModelBinders.Binders.Add(typeof(MyClass), new MyClassModelBinder()); 

И затем использовать кэширование вывода, как это ,

[OutputCache(Duration = 300, VaryByCustom = "myClass")] 
public ActionResult MyAction(MyClass myClass) 
{ 
    ....... 

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    ... check we're working with 'MyClass' 

    var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context)); 
    var myClass = (MyClass)routeData.Values["myClass"]; <-- This is always null 

myClass не входит в событие таблицы маршрутов, хотя модель переплетена.

Любая помощь, как всегда, будет наиболее желанной.

Приветствия

ответ

5

Модель связующего не добавляет модели к RouteData, так что вы не можете ожидать, чтобы забрать его оттуда.

Одна возможность состоит в том, чтобы сохранить модель внутри HttpContext внутри пользовательских модели вяжущего:

public class MyClassModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = new MyClass(); 
     // ... build the class 

     // Store the model inside the HttpContext so that it is accessible later 
     controllerContext.HttpContext.Items["model"] = model; 
     return model; 
    } 
} 

, а затем получить его внутри метода GetVaryByCustomString, используя тот же ключ (model в моем примере):

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    var myClass = (MyClass)context.Items["model"]; 

    ... 
} 
+0

Чувствуется немного хакерским, но он работает. Приветствия. – Magpie

+0

@ Магпи, приветствия. –