#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 для этого, верно? Спасибо.