Mag*_*pie 1 c# asp.net-mvc outputcache model-binding
我有一个类我模型绑定,我想使用它的输出缓存.我找不到一种方法来访问绑定对象GetVaryByCustomString
例如:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Global.cs中设置了绑定器
ModelBinders.Binders.Add(typeof(MyClass), new MyClassModelBinder());
Run Code Online (Sandbox Code Playgroud)
然后像这样使用输出缓存.
[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
Run Code Online (Sandbox Code Playgroud)
虽然模型绑定器已触发,但myClass不在路由表事件中.
一如既往的帮助将是最受欢迎的.
干杯
模型绑定器不会将模型添加到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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后GetVaryByCustomString使用相同的密钥model在我的方法中检索它(在我的例子中):
public override string GetVaryByCustomString(HttpContext context, string custom)
{
var myClass = (MyClass)context.Items["model"];
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |