【问题标题】:Bypass redundant code in controller绕过控制器中的冗余代码
【发布时间】:2023-03-11 14:09:02
【问题描述】:

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

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

    return PartialView("_FormA", ModelWithData)
}

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

    return PartialView("_FormB", ModelWithData)
}

两个视图都使用相同的数据,但显示的内容不同。

如果FormB() 被调用,FormA() 肯定之前被调用过。

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

我的问题对我来说似乎很愚蠢,但我找不到解决方法......

感谢您的帮助!

【问题讨论】:

  • 基于此信息,我不能说这绝对是一个好建议,但您可能可以将结果缓存在 FormA 中,然后在 FormB 中取回它们。您将引入一种从缓存中获取或根据需要进入数据库的新方法。
  • 如果两者的代码相同,则需要将结果存储在缓存中,否则 TempData 将是减少数据库请求的好选择。
  • 不能只提取私有方法中的共享代码?这也是您可以缓存从 DB 检索到的内容的地方。

标签: c# asp.net-mvc code-duplication


【解决方案1】:

是的,通过将某种过滤器传递给您的操作方法,如下所示

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多