2011-02-03 7 views
0

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

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

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? Или есть другой лучший способ его реализовать?

ответ

3

Наиболее распространенные способы были бы таковы:

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

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

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

ASP.NET MVC 3 также представляет новый вид html-помощника, который лучше подходит для создания библиотеки элементов многократного использования. Хорошо, что вы можете написать html-помощники в разметке Engine Razor. См. this blog article для получения более подробной информации.

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

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

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

+0

+1 избили меня до этого, и более чистый/лаконичный для загрузки! – RPM1984

+0

@ RPM1984: Спасибо за вашу честность и честность! –

+0

Я на самом деле использую смесь обоих методов, которые вы описываете, но у меня другая проблема. Пожалуйста, прочитайте EDIT – devfreak

Смежные вопросы