2012-01-06 5 views
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); 
    } 
} 
+0

Если у вас есть общие действия ActionResults, я бы сказал, что делать это в базовом классе нормально. Если вы хотите разделить свойство или объект, как список статусов, поместите его в класс Common и выберите его таким образом. –

+0

Да, я тоже. Это может зависеть от того, что вы делаете с этим. – tugberk

ответ

2

Основываясь на этой линии,

newViewModel.Status = GetStatus(); 

Я бы сказал, что GetStatuses не должен быть методом на контроллере. Контроллеры должны обрабатывать запросы Http и возвращать ответы HTTP. Эти ответы могут быть файлами, представлениями, json и т. Д. Но это выглядит так, как это не так, как вы используете GetStatuses и что он не предназначен для возврата в качестве ответа Http. Если это действительно так, оно должно идти иначе.

Мои приложения MVC всегда имеют сервисный уровень, который служит для просмотра моделей. Таким образом, в моем приложении этот уровень сервиса будет обслуживать статусы.

1

Я бы предпочел состав над наследованием и инкапсулировал код в другой объект, а затем ввел объект в контроллер. особенно в этом случае.

и в этом случае настройка отображения списка Enum может быть даже лучше подходит для частичного контроллера/представления.

2

Это кажется правильным, вы, вероятно, могли бы сделать его статическим и защищенным.

+0

Я кое-что поймаю. Я понимаю, что «защищает» приносит это, но что «статично» будет полезно здесь? – tugberk

+0

static означает, что вы можете получить доступ к свойству без создания экземпляра объекта. –

+1

@tugberk Поскольку ваш метод не используется для использования каких-либо данных-членов, он фактически статичен - он не зависит от экземпляра, а только от параметров и других статических данных (в вашей acse система типов, окружающая класс Status/enum) –

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) %> 

Я предпочитаю ответ, представленный Симоном, который позволяет использовать Meta Description атрибут customzie вывода для имен Enum:

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