我在多个控制器中有一个共同的方法,而不是全部。将方法放在控制器基础中并且所有其他控制器都继承它是正确的吗?
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);
}
}
答案 0 :(得分:2)
这似乎是对的,你可能会把它变成静态和保护。
答案 1 :(得分:2)
我实际上采取了不同的方法。我为此使用了一些自定义HTML帮助程序,类似于以下内容:
这样你就可以使用:
<%: 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)
我更喜欢组合而不是继承,并将代码封装在另一个对象中,然后将对象注入控制器。特别是在这种情况下。
在这种情况下,设置枚举列表的渲染甚至可能更适合部分控制器/视图。