1

我在多个控制器之间有一个通用的方法,而不是全部。将方法放在控制器库中并且所有其他控制器都继承它是否正确?

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

4 回答 4

2

这似乎是对的,您可以将其设为静态并受保护。

于 2012-01-06T17:48:04.443 回答
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 名称的输出:

如何从 ASP.NET MVC 中的枚举创建下拉列表?

于 2012-01-06T17:52:34.357 回答
2

基于这条线,

newViewModel.Status = GetStatus();

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

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

于 2012-01-06T18:06:24.140 回答
1

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

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

于 2012-01-06T17:45:44.577 回答