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

本文关键字:方法 之间 控制器 | 更新日期: 2023-09-27 18:19:35

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

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

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

基于这一行,

newViewModel.Status = GetStatus();

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

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

这似乎是对的,您可能会使它成为静态的并受到保护。

我实际上会采取不同的方法。我为此使用了一些自定义的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中从枚举创建下拉列表?

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

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