控制器中使用MVC3中的助手以及视图吗?关于MVC3帮手的清晰?
帮手是放置常用控制器方法的正确位置吗?
我想创建一个通用的方法来获取数据库中的所有子孩子ID,并确保它在正确的区域。我只是想确保我把我的逻辑放在正确的领域。
感谢
控制器中使用MVC3中的助手以及视图吗?关于MVC3帮手的清晰?
帮手是放置常用控制器方法的正确位置吗?
我想创建一个通用的方法来获取数据库中的所有子孩子ID,并确保它在正确的区域。我只是想确保我把我的逻辑放在正确的领域。
感谢
您可以实现为逻辑基础Controller
。助手,或扩展方法,当你不想改变接口的东西时很有用。
HtmlHelper不可用于控制器,因为控制器不应该负责生成HTML,但UrlHelper在控制器中可用。
从数据库中获取特定数据的方法不属于您的控制器,也不属于UrlHelper或HtmlHelper。你应该为这个逻辑创建一个单独的类,然后从你的控制器中调用这个类的方法。如果您正在使用依赖注入,我建议,你的控制器代码可能是这样的:
public class MyController
{
IMyDataUtil _dataUtil;
public MyController(IMyDataUtil dataUtil)
{
_dataUtil = dataUtil;
}
public ActionResult SomeAction(int parentId)
{
var childIds = _dataUtil.GetChildIds(parentId);
...
}
}
正如你所看到的,这可以让你保持的数据访问代码在专门为此目的而设计的一类。这个控制器依赖于该实用程序类的事实立即显而易见,并且不需要比在助手上调用扩展方法更多的代码。不处理这个类的方法的控制器不需要它可用。另一方面,如果有一些方法可能被一堆不同的控制器使用,那么将相同的数据类注入到所有这些控制器中可能会变得麻烦。在这种情况下,您可以:
我想创建一个通用的方法来获取数据库中的所有子孩子ID,并确保它位于正确的区域。我只是想确保我把我的逻辑放在正确的领域。
这听起来像是一个ActionFilter的工作。
如果“助手”你指的是东西,如HtmlHelper
然后,不,这些都不是由控制器使用,如理论你可以把你的控制器和具有完全不同的渲染再次使用,引擎(例如WPF)作为控制器不负责渲染。
如果你正在谈论的话,正如我认为的那样,操纵你的数据的辅助类/方法已经准备好由控制器放入模型中,然后交给View进行展示,那么你可以考虑一个“业务逻辑”层。例如,如果你在谈论(不断典型值)的银行帐户例如,你可以有:
public class BankAccountService
{
public IEnumerable<string> GetAllAccountIdsForCustomer(int customerId)
{
// Talk to the database here and retrieve the account id's for a customer
}
public string GetCustomerName(int customerId)
{
// Talk to the database here and retrieve the customer's name
}
}
你的控制器将接着:
public ActionResult AccountNumbers(int customerId)
{
var model = new AccountNumbersModel();
model.CustomerId = customerId;
model.AccountNumbers = BankAccountService.GetAllAccountIdsForCustomer(customerId);
return View(model);
}
很显然,在这个例子中你需要有一个名为AccountNumbersModel
的类定义了,你也可能想要考虑使用依赖注入为你的控制器提供一个BankAccountService
的实例,但是描述了如何去做所有这些都不属于这个答案的范围。
这种方法给你可测性和分离的优点,每一段代码是负责一个任务,你减少每个单独的复杂性,并使其更容易进行修改而不断裂的事情。
所以基本上我把逻辑放在像其他MVC框架一样的模型中? – Darren 2012-02-07 18:01:39
不,模型应该是无逻辑的(IMO),您可以使用业务层/服务来完成“在数据库中获取所有子子标识”的繁琐工作,并将结果交给模型,以便视图可以显示它。如果不知道更多关于你正在做什么的情况,解释会有点棘手。) – Rob 2012-02-07 18:07:47
对不起,我很困惑。基本上我有一个下拉列表,我正在填充当前用户的所有子用户。子用户通过多对多表来定义。所以我需要获得该表中具有该用户的父ID的所有ID。通常在其他框架中,我将它作为模型方法,但是在MVC3中,它似乎在理论上有所不同。 – Darren 2012-02-07 18:16:04
我也在想,即使它没有在所有的控制器上使用? – Darren 2012-02-07 17:44:01
只是不从它派生,如果你不需要它。 – 2012-02-07 17:46:29
尽量避免在你的控制器中的数据特定的代码,除非简单地将数据值传递给另一个服务层,存储库等 – 2012-02-07 18:44:54