2017-04-20 29 views
0

我的控制器中有两个方法在点击时通过ajax调用。两者完全相同(从数据库中检索相同的数据),并返回一个部分视图以及包含检索数据的模型。唯一的区别是视图。在控制器中绕过冗余代码

public PartialViewResult FormA() 
{ 
    [...// Code] 

    return PartialView("_FormA", ModelWithData) 
} 

public PartialViewResult FormB() 
{ 
    [...// same Code as in FormA()] 

    return PartialView("_FormB", ModelWithData) 
} 

这两个视图使用相同的数据,但显示不同的东西。

如果FormB()被称为FormA()肯定已被调用过。

必须有办法绕过第二个方法/数据库请求。由于额外的数据库请求,它明显减慢了应用程序的速度。

我的问题似乎真的愚蠢到我,但我没能找到一个解决办法...

THX对您有所帮助!

+0

基于这个信息我不能说这绝对是好建议,但它可能是,你可以缓存结果在'FormA'并让他们退出'FormB'。您将介绍一种从缓存中获取或根据需要转到数据库的新方法。 – Crowcoder

+1

如果两者具有相同的代码,则需要将结果存储在缓存中,否则TempData将是减少数据库请求的不错选择。 –

+0

不能只提取私有方法中的共享代码?而且这也是您可以缓存从DB检索到的内容的位置。 –

回答

2

通过传递某种过滤器到您的操作方法如下图所示

public PartialViewResult ShowForm(string filter) 
{ 
    if(TempData["model"] == null) 
    { 
    [...// Code] 
    TempData["model"] = ModelWithData; 
    } 
    if(filter == "some_condition") 
    return PartialView("_FormA", TempData["model"] as ModelWithData); 
    else 
    return PartialView("_FormB", TempData["model"] as ModelWithData); 
} 

现在得到你的观点是肯定的。你可以使用任何类型的状态管理机制。说TempData

+1

但是这样我只是减少了代码量。它仍然执行两次。或者我错了? –

+0

我想他不想两次调用数据库,即使使用此过滤器,代码也必须两次到数据库以检索传递给视图的对象。 –

+0

@ErikT。,现在明白了......如果有帮助,请参阅编辑答案。 – Rahul