多个控制器之间的通用方法

时间:2012-01-06 17:43:24

标签: c# asp.net-mvc-3 methods asp.net-mvc-controller

我在多个控制器中有一个共同的方法,而不是全部。将方法放在控制器基础中并且所有其他控制器都继承它是正确的吗?

public class BaseController : Controller
{
    public IEnumerable<SelectListItem> GetStatus()
    {
        IList<SelectListItem> status = new List<SelectListItem>();

        status.Add(new SelectListItem() { Text = "Select", Value = "" });

        Enum.GetValues(typeof(Status)).Cast<Status>().ToList().Select(x => new SelectListItem()
        {
            Text = x.ToString(),
            Value = ((byte)x).ToString()
        }).ToList().ForEach(status.Add);

        return status;
    }
}

public class DownloadController : BaseController
{
    public ActionResult New()
    {
        NewViewModel newViewModel = new NewViewModel();

        newViewModel.Status = GetStatus();

        return View(newViewModel);
    }
}

4 个答案:

答案 0 :(得分:2)

这似乎是对的,你可能会把它变成静态和保护。

答案 1 :(得分:2)

我实际上采取了不同的方法。我为此使用了一些自定义HTML帮助程序,类似于以下内容:

http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx

这样你就可以使用:

 <%: Html.EnumDropDownListFor(model => model.EnuProperty) %>

我更喜欢Simon提交的答案,它允许您使用Meta Description属性来定制Enum名称的输出:

How do you create a dropdownlist from an enum in ASP.NET MVC?

答案 2 :(得分:2)

基于这一行,

newViewModel.Status = GetStatus();

我认为GetStatuses不应该是控制器上的方法。控制器应该处理Http请求并返回http响应。这些响应可以是文件,视图,json等......但它看起来并不是因为这不是你使用GetStatuses的方式,而是它不打算作为Http响应返回。如果情况确实如此,它应该去其他地方。

我的MVC应用程序总是有一个服务层来提供视图模型。因此,在我的应用程序中,此服务层将为状态提供服务。

答案 3 :(得分:1)

我更喜欢组合而不是继承,并将代码封装在另一个对象中,然后将对象注入控制器。特别是在这种情况下。

在这种情况下,设置枚举列表的渲染甚至可能更适合部分控制器/视图。