Тот же частичный вид MVC для DropDownListFor, но укажите другой идентификатор элемента управления

#jquery #asp.net-mvc #asp.net-mvc-4 #razor

#jquery #asp.net-mvc #asp.net-mvc-4 #razor

Вопрос:

Можно ли использовать один и тот же частичный вид более одного раза на странице для отображения выпадающего списка с разными идентификаторами?

Я создал частичное представление:

 @model XXXX_Web_App.Models.LanguageListPartialViewModel

@Html.DropDownListFor(
    x => x.SelectedLanguage,
    Model.Languages,
    new { @class = "form-control" }
)
 

Он включен в _Layout.cshtml с:

 <form action="/Account/TestPartial" method="get">
    @Html.Action("LanguageListPartial", "Account")
</form>
 

и отображает как:

 <form method="get" action="/Account/TestPartial" novalidate="novalidate">
    <select name="SelectedLanguage" id="SelectedLanguage">
        <option value="en-US" selected="selected">English</option>
        <option value="fr-CA">Français</option>
        <option value="pt-BR">Português</option>
        <option value="es-MX">Español</option>
    </select>
</form>
 

Изменение выделения в заголовке запускает функцию jQuery в _Layout.cshtml:

 <div id="test" class="hide"></div>

<script type="text/javascript">
    $(function () {
        $('#SelectedLanguage').on('change', function () {
            var culture = $(this).val();
            $('#test').load("/Account/LanguageListPartial/"   culture, function () {
                location.reload(true);
            });
        });
    });
</script>
 

Все вышеперечисленное работает нормально, но у меня есть несколько страниц, где требуется тот же выпадающий список. Например, когда пользователь регистрируется для новой учетной записи или когда существующему пользователю необходимо отредактировать свой профиль. Поэтому я хотел бы включить выпадающий список в эти представления, которые имеют свою собственную <form> оболочку, например:

 @Html.Action("LanguageListPartial", "Account")
 

Это приводит к появлению двух выпадающих списков с одинаковым идентификатором, и я, конечно, понимаю, почему это происходит. Это нарушает jQuery.

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

Или даже если мне нужно создать другое частичное представление, есть ли способ указать в частичном представлении, какой идентификатор я хочу, чтобы DropDownListFor отображал вместо использования идентификатора модели, чтобы я мог использовать те же действия контроллера? Имейте в виду, что выпадающий список заголовка не выполняет POST, поскольку он запускается только jQuery. (Я думаю, это правильный способ объяснить это).

Ответ №1:

Конечно, вы можете указывать разные идентификаторы в значениях маршрута при создании частичного представления:

  @Html.Action("LanguageListPartial", "Account", 
               new {id=someid, selectedlanguage=language})
 

Измените действие на

 public ActionResult LanguageListPartial(string id, string selectedlanguage)
 

Внутри контроллера присвоите значение viewbag,

  ViewBag.differentid=id;
 

и используйте его в своем частичном представлении в качестве идентификатора.

  @model XXXX_Web_App.Models.LanguageListPartialViewModel

 @Html.DropDownListFor(
    x => x.SelectedLanguage,
    Model.Languages,
    new { id = ViewData["differentid"] }
 )
 

Комментарии:

1. О, здорово, я бы не подумал, что это возможно. Итак, идентификатор / имя задается в ViewBag в действии LanguageListPartial Controller, но как действие контроллера будет определять, на что устанавливать идентификатор? Я, вероятно, оставил бы выпадающий список head неизменным, конечно, но использовал бы уникальный идентификатор в нескольких представлениях, где он будет дублироваться.

2. Понял. Аккуратно! Спасибо, Даню.

3. С удовольствием. Удачи.

4. на что new {droplistid = someid} ссылается действие контроллера? Я имею в виду, someid это значение для сохранения в ViewBag. И droplistid это действительно должно быть differentid в вашем примере?

5. Мне нужно создать новый MapRoute для этого, верно? Спасибо.