3

我有一个 MVC 应用程序。以下代码在一个控制器和多个控制器中的多个位置使用。我想将此代码放在一个地方并从每个位置调用它。在 MVC 中做到这一点的最佳方法是什么?

下面的代码从数据库中获取一行并创建可以从视图中读取的 ViewData。使用网络表单,我将在一个类中创建一个公共子并传递年份和月份值。有没有办法让这段代码成为模型的一部分?

var monthlyexpenseincome = (from vu_monthlyresult in dbBudget.vu_MonthlyResults
                            where vu_monthlyresult.Month == defaultmonth && vu_monthlyresult.Year == defaultyear
                            select vu_monthlyresult).Single();

var yearlyexpenseincome =  (from vu_yearlyresult in dbBudget.vu_YearlyResults
                            where vu_yearlyresult.Year == defaultyear
                            select vu_yearlyresult).Single();

ViewData["MonthlyExpenses"] = monthlyexpenseincome.Expenses;
ViewData["MonthlyIncome"] = monthlyexpenseincome.Income;
ViewData["MonthlyProfit"] = monthlyexpenseincome.Income - monthlyexpenseincome.Expenses;
4

2 回答 2

1

一般来说,如果你有跨多个控制器的公共代码,你可以创建另一个继承自 Controller 的类,并将你的方法保留在那里,让你的个人控制器继承这个新类

public class BaseController : Controller
{
   protected string GetThatInfo()
   {
      //do your magic logic and return some thing useful
      return "This is demo return.Will be replaced";
   }
}

现在你可以为你的其他控制器继承这个

public class UserController: BaseController 
{
  public ActionResult Index()
  {
    return VieW();
  } 
}     

但在您的情况下,您正在获取的数据是特定于您的域数据的。所以我建议你把它移到另一个类(比如一个新的服务/业务层)

public static class ProfitAnalysis
{
  public static decimal GetTotalExpense()
  {
     //do your code and return total
  }

}

你可以从任何你想要的地方调用它

decimal totalExp=ProfitAnalysis.GetTotalExpense();

而且您很快就会意识到,使用如此之多ViewData会使您的代码难以阅读和维护。不要等到那一天。切换到强类型类来传递数据。

于 2012-08-10T22:23:08.160 回答
0

您应该将查询放在“业务层”中,这只是您调用以执行业务逻辑的类。然后你可以在任何你喜欢的地方重用它,只需实例化业务类并使用它。如果它们不需要状态,您也可以将方法设为静态,那么您甚至不必实例化它。

例如:

var expenseService = new expenseService();

ViewData["MonthlyExpenses"] = expenseService.GetMonthlyExpenses();
于 2012-08-10T22:17:26.480 回答