2012-02-07 51 views
4

控制器中使用MVC3中的助手以及视图吗?关于MVC3帮手的清晰?

帮手是放置常用控制器方法的正确位置吗?

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

感谢

回答

4

您可以实现为逻辑基础Controller。助手,或扩展方法,当你不想改变接口的东西时很有用。

+0

我也在想,即使它没有在所有的控制器上使用? – Darren 2012-02-07 17:44:01

+0

只是不从它派生,如果你不需要它。 – 2012-02-07 17:46:29

+0

尽量避免在你的控制器中的数据特定的代码,除非简单地将数据值传递给另一个服务层,存储库等 – 2012-02-07 18:44:54

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. Combine步骤1和步骤2.
0

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

这听起来像是一个ActionFilter的工作。

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的实例,但是描述了如何去做所有这些都不属于这个答案的范围。

这种方法给你可测性分离的优点,每一段代码是负责一个任务,你减少每个单独的复杂性,并使其更容易进行修改而不断裂的事情。

+0

所以基本上我把逻辑放在像其他MVC框架一样的模型中? – Darren 2012-02-07 18:01:39

+0

不,模型应该是无逻辑的(IMO),您可以使用业务层/服务来完成“在数据库中获取所有子子标识”的繁琐工作,并将结果交给模型,以便视图可以显示它。如果不知道更多关于你正在做什么的情况,解释会有点棘手。) – Rob 2012-02-07 18:07:47

+0

对不起,我很困惑。基本上我有一个下拉列表,我正在填充当前用户的所有子用户。子用户通过多对多表来定义。所以我需要获得该表中具有该用户的父ID的所有ID。通常在其他框架中,我将它作为模型方法,但是在MVC3中,它似乎在理论上有所不同。 – Darren 2012-02-07 18:16:04