Пользовательский элемент управления ASP.NET MVC2 - PullRequest
0 голосов
/ 04 февраля 2011

Какой правильный способ MVC для создания пользовательского элемента управления формы (например, пользовательский выпадающий список)?Мне нужен способ создать такой элемент управления и повторно использовать его на нескольких страницах.Я хочу использовать связыватель по умолчанию для привязки выбранного значения при вызове метода действия.Может кто-нибудь привести простой пример, как это делается?

Вот мое текущее решение, которое, по моему мнению, не очень хорошо разработано.

DropDownViewModel.cs

class DropDownViewModel {
    ...
    public string BindName {get; set;} // the name that default binder uses to bind to action param
    public int SelectedValue {get;set;} // this value should be set when user use the drop down
    ...
}

DropDown.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownViewModel>" %>
...
<%= Html.TextBox(Model.BindName) %> 
...

Проблема возникает, когда я пытаюсь включить DropDownViewModel в какую-то другую модель представления, например, такую:

GeneralUserInfoViewModel.cs

class GeneralUserInfoViewModel {
    ...
    public DropDownViewModel Gender {get;set;}
    ...
}

AccountController.cs

...
public ActionResult EditGeneralUserInfo(GeneralUserInfoViewModel info) { 

}
...

Для правильной работы BindName должно быть установлено в «Gender.SelectedValue».Это можно решить, установив BindName в RegisterUserViewModel.Но что произойдет, если GeneralUserInfoViewModel является частью другой модели представления, например:

RegisterUserViewModel.cs

class RegisterUserViewModel {
    ...
    public GeneralUserInfoViewModel GeneralInfo {get;set;}
    ...
}

Теперь для BindName должно быть установлено значение «GeneralInfo.Gender.SelectedValue», чтобы это работалоправильно со связывателем по умолчанию:

...
public ActionResult RegisterUser(RegisterUserViewModel info) { ... }
...

и т. д. Как можно справиться с этим наслоением?Как я могу определить, что должно быть установлено в BindName attr в DropDownVoewModel?Или есть другой лучший способ реализовать это?

1 Ответ

3 голосов
/ 04 февраля 2011

Наиболее распространенными способами являются следующие:

  • Создайте htmlhelper , который вы можете вызвать, чтобы отобразить свой элемент управления. Это самый мощный и самый чистый метод, но он также довольно утомителен, так как вам нужно собрать разметку html в c #.

  • Поместите свой элемент управления на частичную страницу и вызовите Html.RenderPartial или Html.Partial, чтобы отобразить его. Это имеет то преимущество, что вы можете написать HTML-разметку. Это легче и лучше читаемо, чем помощники c # html.

Вы также можете использовать смесь обоих. Или используйте второй подход со строго основанной моделью представления и позвольте модели представления выполнить инициализацию, давая вам своего рода смесь между этими подходами.

В ASP.NET MVC 3 также представлен новый вид помощника html, который лучше подходит для создания многократно используемой библиотеки элементов управления. Хорошая вещь в том, что вы можете написать свои помощники html в Razor View Engine Разметка. Подробнее см. в этой статье блога .

Edit: Способ, которым я реализовал общий выпадающий список ajaxed, фактически отличается от двух, упомянутых выше. Работает следующим образом:

  1. Создание шаблона редактора для выпадающих списков
  2. Используйте Html.EditorFor () для визуализации шаблонов редактора
  3. Мои модели имеют два свойства в раскрывающемся списке: значение и параметры. Значение украшено атрибутом DisplayHint, поэтому оно всегда отображается в шаблоне редактора выпадающего списка

ASP.NET MVC позаботится о любых префиксах контекста модели автоматически. Если вы не знакомы с шаблонами редактора: Брэд Уилсон написал очень хорошую серию статей в блоге об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...