关于MVC3中助手的清晰度?

时间:2012-02-07 17:40:05

标签: asp.net asp.net-mvc-3

MVC3中的助手是否在控制器和视图中使用?

帮助者是否适合放置常用的控制器方法?

我想创建一个通用方法来获取数据库中的所有子子ID,并确保它位于正确的区域。我只想确保将逻辑放在正确的区域。

由于

4 个答案:

答案 0 :(得分:4)

您可以为该逻辑实现基础Controller。当您不想更改某些内容的界面时,助手或扩展方法非常适合。

答案 1 :(得分:2)

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);
        ...
    }
}

如您所见,这允许您将数据访问代码保存在专门为此目的设计的类中。这个控制器依赖于该实用程序类的事实是显而易见的,并且除了在辅助程序上调用扩展方法之外,它不会占用更多的代码。不处理该类方法的控制器不需要使用它。

另一方面,如果有许多方法可能被一堆不同的控制器使用,那么将相同的数据类注入所有这些控制器可能会变得很麻烦。在这种情况下,您可以:

  1. 通过方法或属性注入扩展一个基类,该基类具有注入其中的数据访问类实例,然后通过受保护或公共属性将其公开给子类,或者
  2. 创建自己的帮助器类,它包装了您可能在所有控制器中使用的类和方法,并注入该类,因此您只有一个依赖项用于各种常用函数,或者
  3. 合并第1步和第2步。

答案 2 :(得分:1)

如果通过“帮助者”你指的是诸如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的实例,但是如何解决所有这一切都超出了这个答案的范围。

这种方法为您提供的优势是可测试性分离,每一段代码都负责一项任务,并且您可以降低每个单独部分的复杂性并使其成为可能更容易进行更改而不会破坏。

答案 3 :(得分:0)

  

我想创建一个通用方法来获取数据库中的所有子子ID,并确保它位于正确的区域。我只想确保将逻辑放在正确的区域。

这听起来像是ActionFilter的工作。