我有一个MVC应用程序。以下代码用于控制器和多个控制器中的多个位置。我想将这些代码放在一个地方,并从每个位置调用它。在MVC中最好的方法是什么?
下面的代码从数据库中获取一行,并创建可从视图中读取的ViewData。使用webforms,我会在类中创建一个public sub并传递年和月值。这段代码有没有办法成为模型的一部分?
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;
答案 0 :(得分: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
这么多用法会使你的代码难以阅读和维护。不要等到那一天。切换到强类型类以传递数据。
答案 1 :(得分:0)
您应该将查询放在“业务层”中,这只是您调用以执行业务逻辑的类。然后,您可以在任何您喜欢的地方重用它,只需实例化业务类并使用它。如果方法不需要状态,你也可以使这些方法保持静态,那么你甚至不必实例化它。
例如:
var expenseService = new expenseService();
ViewData["MonthlyExpenses"] = expenseService.GetMonthlyExpenses();