DropdownListFor的相同MVC部分视图,但指定不同的控件ID

时间:2014-06-27 01:28:47

标签: jquery asp.net-mvc asp.net-mvc-4 razor

是否可以在页面上多次使用相同的部分视图来呈现具有不同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触发。 (我认为这是解释它的正确方法)。

1 个答案:

答案 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"] }
 )