谁能解释我如何JsonResult在MVC 5应用程序中实现缓存操作?我想ajax使用[OutputCache()] 属性来缓存一些被调用的动作.其中一些操作返回ActionResult与html-content,一些JsonResult具有系列化名单{Id, Title}对其中我将用来构造下拉列表.
我的目标是减少数据库查询(构建ViewModel时)和服务器请求(当使用ajax调用时).
所以,我的代码看起来像下面的代码片段:
[OutputCache(Duration=60*60*24)]
public async Task<ActionResult> SearchCaseOrgDialog(){
//extract data return html page
return View();
}
[OutputCache(Duration=60*60*24)]
public async Task<JsonResult> AjaxOrgDepartments(){
//query database, serialize data, return json
var result = await ctx.OrgDepartments
.Select(d => new {
Id = d.Id,
Title = d.Title }
)
.ToListAsync();
return Json(result, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
当我查看FireFox工具面板时,我会看到下一张图片 - 内容Html:

这里Firefox使用ajax-requested页面的客户端缓存版本.
它不缓存内容,似乎从服务器(服务器端缓存)传输数据.
在这两种情况下,响应头看起来都一样:
Cache-Control:"public, max-age=86400, …Run Code Online (Sandbox Code Playgroud) 大家好:)这是我在stackoverflow的第一个问题:)
在Delphi XE2 RTTI中我们有TRttiMethod类,它具有CreateImplementation()动态创建过程或函数的功能,它具有相同的签名和与其正文相同的方法.
使用TRttiContext.getMethods()/ getMethod()我们可以获得类方法的集合 - TRttiMethod的集合.
文档说(http://docwiki.embarcadero.com/VCL/en/RTTI.TRttiMethod)不要直接创建TRTTiMethod,并使用getMethods()来获取其实例.
所以,如果我们有TRTTIMethod实例,我们可以动态创建具有相同签名的方法,并在以后调用它.
问题是..例如,我们有TNotifyEvent ... TRttiContext.getType(typeinfo(TNotifyEvent))返回TRttiType具有typekind =的实例对象tkMethod.我们知道TNotifyEvent的签名是对象的过程(sender:TObject);
有可能得到TRttiMethod这个吗?我想为事件动态创建eventHandler,TRttiMethod.CreateImplementation()
或者可能有另一种方法动态创建方法实现?
PS:想法是创建类似事件链的东西.在编译时,我们不知道事件类型/签名,因此我们可以使用泛型,如TEvenChain <TNotifyEvent>.Chain在已注册的事件处理程序上有集合,因为我们在编译时不知道处理程序类型,我们必须动态创建它,并且该处理程序只获取其参数并使用它们调用已注册的处理程序.
更新: 这里是一些代码(想法是创建事件处理程序链):
procedure TMainForm.FormCreate(Sender: TObject);
begin
FEventChain := TNotifyChain.Create();
FEventChain.AddHandler(event1);
FEventChain.AddHandler(event2);
TestButton.OnClick := FEventChain.EventHandler;
end;
Run Code Online (Sandbox Code Playgroud)
Event1&event2是(sender : TObject)形式的方法; 它不是一般示例(T在这种情况下是NotifyEvent/TChain <TNotifyEvent>)
TEventChain.EventHandler是TNotifyEvent太
TNotifyChain 是
TNotifyChain = class(TObject)
strict private
FEvent : TNotifyEvent;
FItems : TList<TNotifyEvent>;
FCtx : TRttiContext; …Run Code Online (Sandbox Code Playgroud)