2

在过去的两天里,我试图弄清楚如何在 javascript 的帮助下选择下拉列表中的新项目时动态更新复选框列表。

一周前我做了同样的事情,我应该从下拉列表更新到下拉列表。

到目前为止我得到了什么:

看法

@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.User, (IEnumerable<SelectListItem>)Model.UserList, "-- vælg bruger --")
    if (Model.checkboxlist != null)
    {
       for (var i = 0; i < Model.checkboxlist.Count; i++)
       {
        <div class="editor-label">
           @Html.CheckBoxFor(c => Model.checkboxlist[i].check)
            @Html.LabelFor(c => Model.checkboxlist[i].Id, Model.checkboxlist[i].Id)
            @Html.HiddenFor(c => Model.checkboxlist[i].Id)

        </div>
       }
    }
}
<script type="text/javascript">
    $('#User').change(function () {
    alert('HEJ!');
        var selectedUser = $(this).val();
        alert(selectedUser);
        if (selectedUser != null && selectedUser != '-- vælg bruger --' && selectedUser != '') {
            $.getJSON('@Url.Action("getPdfCheckBoxList","Admin")', { username: selectedUser },
            function (employee) {

                var checkboxlist = $('#checkboxlist');
                checkboxlist.empty();

                $.each(employee, function (index, employee) {
                    checkboxlist.append($('<checkbox/>', {
                        checked = 'false'
                    }));
                });
            });

        }
    });
</script>

当我加载视图 Model.checkboxlist 为 null 时,我没有返回任何东西来建模下拉列表项。

控制器动作:

public ActionResult getPdfCheckBoxList(String username)
{
    MethodService service = new MethodService();
    var list = new List<PDFCheckBoxList>();


    foreach (var pdfCheckBoxList in getPDFFileNames(username))
    {
        list.Add(new PDFCheckBoxList { check = false, Id = pdfCheckBoxList });
    }
    return Json(list, JsonRequestBehavior.AllowGet);
} 

现在,甚至 Alert("HEJ") 都没有被解雇,我根本不知道为什么......请帮忙?

4

2 回答 2

6

您可以使用部分视图并让您的控制器操作返回一个部分并在服务器上构建标记,而不是在客户端上执行它:

@using (Html.BeginForm())
{
    @Html.DropDownListFor(
        x => x.User, 
        Model.UserList, 
        "-- vælg bruger --",
        data_url = Url.Action("getPdfCheckBoxList", "Admin")
    )
    <div id="checkboxlist">
        @if (Model.checkboxlist != null)
        {
            @Html.Partial("_checkboxlist", Model.checkboxlist)
        }
    </div>
}

然后定义_checkboxlist.cshtml

@model IEnumerable<PDFCheckBoxList>
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "checkboxlist";
}
@Html.EditorForModel()

最后是~/Views/Shared/EditorTemplates/PDFCheckBoxList.cshtml将为每个元素呈现的编辑器模板:

@model PDFCheckBoxList
<div class="editor-label">
    @Html.CheckBoxFor(c => c.check)
    @Html.LabelFor(c => c.Id, Model.Id)
    @Html.HiddenFor(c => c.Id)
</div>

现在你可以像这样修改你的javascript:

<script type="text/javascript">
    // Now that we no longer have any server side 
    // code here we could externalize this script
    // into a separate javascript file

    $('#User').change(function () {
        if (selectedUser != null && selectedUser != '') {
            var selectedUser = $(this).val();
            var url = $(this).data('url');
            var data = { username: selectedUser };
            $('#checkboxlist').load(url, data);
        }
    });
</script>

最后是你的getPdfCheckBoxList行动:

public ActionResult getPdfCheckBoxList(String username)
{
    var service = new MethodService();
    var list = getPDFFileNames(username)
        .Select(x => new PDFCheckBoxList 
        { 
            check = false, 
            Id = x 
        })
        .ToList();
    return PartialView("_checkboxlist", list);
}

如果您想在客户端上构建标记并让控制器操作返回 JSON,我建议您使用一些 javascript 模板框架。

于 2012-04-10T06:30:31.073 回答
0

您要么选择器错误"#User",要么在同一页面上多次使用该 id

从浏览器查看生成的页面源并查找<select>元素是否有id="User"或有多个 id 等于"User"

于 2012-04-09T16:06:13.753 回答