ASP.NET MVC View User Control - как установить идентификаторы? - PullRequest
7 голосов
/ 05 ноября 2008

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

Я думал, что элемент управления будет выглядеть примерно так:

<select name="" id="">
   <option value="AL">Alabama</option>
   <option value="AK">Alaska</option>
</select>

И код на мой взгляд будет выглядеть примерно так:

<%= Html.RenderPartial("StateDropdownControl") %>

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

Буду ли я делать это с ViewData как-нибудь?

Ответы [ 3 ]

9 голосов
/ 05 ноября 2008

Кори идет к правильному решению. Я думаю, что объявление конкретных объектов Model для вашего вида делает ОЧЕНЬ простыми и в качестве побочного бонуса облегчает их тестирование.

Таким образом, вместо простой передачи идентификатора в качестве объекта, вы, вероятно, захотите создать свой собственный объект Model для передачи.

Это может выглядеть примерно так:

public class StateDropDownPresentationModel
{
    public string DropDownID { get; set; }
    public string SelectedState { get; set; }
}

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

Тогда вы могли бы назвать это так:

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", new StateDropDownPresentationModel { DropDownID = "MyID", SelectedState = "IL" } %>

Затем просто убедитесь, что вы поставили галочки для таких вещей, как ID, являющийся нулевым / пустым (что, вероятно, должно выдать ошибку) и SelectedState, являющийся нулевым / пустым.

3 голосов
/ 05 ноября 2008

Итак, вы можете передать данные объекта в метод RenderPartial вместе с пользовательским элементом управления для визуализации, чтобы вы могли легко сделать следующее:

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", "MyID") %>

и в UserControl выполните следующее:

<select name="<%=ViewData.Model%>" id="<%=ViewData.Model%>">

....

Просто чтобы быть уверенным, лучший способ справиться с этим - создать простой DTO (объект передачи данных) для хранения этой информации, чтобы вы могли передавать дополнительную информацию своему пользовательскому элементу управления, которая вам неизбежно понадобится.

Пример:


class ComboData 
{
   string ID {get;set;}
   string CssClass {get;set;}
   //Other stuff here
}

<%
var comboData = new ComboData {ID = "myID", CssClass = "comboStyle" }

%>

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", comboData) %>
<select name="<%=ViewData.Model.ID%>" id="<%=ViewData.Model.ID%>" class="<%=ViewData.Model.CssClass%>">

....
</code>

Убедитесь, что в этом примере для кода пользовательского элемента управления задан общий тип ComboData.

1 голос
/ 07 ноября 2008

Взгляните на вспомогательный метод Html.DropDownList. Он имеет ряд перегрузок, которые позволяют передавать данные списка и устанавливать выбранный элемент. самая простая версия просто устанавливает имя выбора.

<%= Html.DropDownList("SelectStates"); %>

Если в ViewData ["SelectStates"] есть значение типа MultiSelectList, список будет заполнен автоматически.

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