是否可以在页面上多次使用相同的部分视图来呈现具有不同ID的下拉列表?
我创建了一个部分视图:
@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>
更改标题中的选择会触发_Layout.cshtml中的jQuery函数:
<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")
执行此操作会导致两个具有相同ID的下拉列表,我理解为什么会发生这种情况,当然。它打破了jQuery。
我的问题:有没有办法指定渲染控件的ID,以便部分视图可以在页面上多次使用?我猜是不...
或者即使我需要创建另一个部分视图,有没有办法在Partial View中指定我希望DropDownListFor呈现的ID而不是使用Model的ID,以便我可以使用相同的Controller Actions?请记住,标题的下拉列表不执行POST,因为它仅由jQuery触发。 (我认为这是解释它的正确方法)。
答案 0 :(得分:1)
当然,您可以在创建局部视图时在路径值中指定不同的ID:
@Html.Action("LanguageListPartial", "Account",
new {id=someid, selectedlanguage=language})
将您的操作更改为
public ActionResult LanguageListPartial(string id, string selectedlanguage)
在控制器内部,为viewbag赋值
ViewBag.differentid=id;
并在部分视图中将其用作id。
@model XXXX_Web_App.Models.LanguageListPartialViewModel
@Html.DropDownListFor(
x => x.SelectedLanguage,
Model.Languages,
new { id = ViewData["differentid"] }
)