【问题标题】:MVC 3: how to update checkboxlist when dropdownlistitem is selected?MVC 3:选择下拉列表项时如何更新复选框列表?
【发布时间】:2012-04-21 23:41:11
【问题描述】:

在过去的两天里,我试图弄清楚如何在 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 为空,因为我没有返回任何东西来建模下拉列表项。

控制器动作:

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") 都没有被解雇,我根本不知道为什么......请帮忙?

【问题讨论】:

  • 浏览器控制台中的任何错误?
  • 好的 1 问题已解决...而不是检查 = 'false' 应该检查:'false'...所以现在我收到弹出窗口...但仍然列出 checkboxlist inst 正在更新

标签: c# javascript asp.net-mvc asp.net-mvc-3


【解决方案1】:

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

@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 模板框架。

【讨论】:

  • 我有 2 个问题,为什么你使用部分然后使用编辑器模板,为什么不从一开始就使用编辑器模板? ViewData.TemplateInfo.HtmlFieldPrefix 有吗?
  • 回答第一个问题:因为编辑器模板被强类型化为PDFCheckBoxList,而getPdfCheckBoxList 操作将IEnumerable&lt;PDFCheckBoxList&gt; 传递给视图。 ViewData.TemplateInfo.HtmlFieldPrefix 允许为 HTML 助手生成的所有输入字段名称添加前缀。这是必要的,以便我们获得&lt;input type="checkbox" name="checkboxlist[0].check" /&gt; 而不是&lt;input type="checkbox" name="check" /&gt;,这会在您提交表单并尝试在 POST 控制器操作中将值映射到视图模型时打破模型绑定器约定。
【解决方案2】:

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

从浏览器查看生成的页面源代码,查找&lt;select&gt;元素是否有id="User"或者有多个id等于"User"

【讨论】:

  • ID 和选择的名称是用户
  • 好的 1 问题已解决...而不是检查 = 'false' 应该检查:'false'...所以现在我收到弹出窗口...但仍然列出 checkboxlist inst 正在更新
  • 我真的不明白你的代码,你清空复选框列表,然后添加新的空的并且没有名称,因为服务器无法读取它们,你到底想要什么?
  • 我想要的是:在下拉列表中的新项目选择上,显示与 getPdfCheckBoxList 方法的返回值相对应的复选框项目。所以它就像级联下拉列表,但带有下拉列表和复选框
  • 它是否从 url 返回正确的值?选择项目时在控制台窗口中检查诸如 firebug 之类的工具,检查它是否触发 ajax 请求,如果触发检查返回值是否正确
猜你喜欢
  • 2013-06-21
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多