【问题标题】:Ho to display multiple checkbox selection based on user's selection from dropdown?如何根据用户从下拉列表中的选择显示多个复选框选择?
【发布时间】:2012-03-15 20:37:36
【问题描述】:

我想在我的 MVC3 razor 应用程序上显示一个下拉框,用户可以从中选择类别,并根据他的选择显示子类别,这些子类别是复选框,以便用户可以选择多个子类别。

谁能帮我弄到这个?

下面是我从 Web 服务收到的 json,我将其反序列化为对象,那么如何将该对象分配给两个不同的列表类别(下拉列表)和子类别(复选框)?

JSON:

 {
 "Code":0,
 "Status":"Done",
 "Categories":[
 {
  "ID":1,
  "Name":"Eat",
    "Subcategories":[
        {"Flag":false,"ID":100,"Name":"Food"},
        {"Flag":false,"ID":101,"Name":"Fast Food"},         
        {"Flag":false,"ID":102,"Name":"Other"}
    ]
        },
    {
    "ID":2,
    "Name":"Entertainment",
     "Subcategories":[
        {"Flag":false,"ID":100,"Name":"All"},               
        {"Flag":false,"ID":101,"Name":"Movie"},
        {"Flag":false,"ID":102,"Name":"Other"}
    ]
  },
  }
  ]
  }

实体:

public class MyData
{
  public int Code { get; set; }
  public string Status { get; set; }
  public List<Category> Categories { get; set; }
}

public class Category
{
  public string Name { get; set; }
  public int ID { get; set; }
  public List<Subcategory> Subcategories { get; set; }
}

public class Subcategory
{
  public string Name { get; set; }
  public int ID { get; set; }
  public bool Flag { get; set; }
}

【问题讨论】:

  • 您的意思是要根据选择的类别将子类别加载为复选框列表吗?是否需要打数据库来加载子类别?
  • 隐藏/显示非常简单,使用类系统或 ID 系统来匹配选择的值...html 样本会有所帮助..更好地描述目标也会有帮助
  • @Daniel Lorenz,是的,我必须调用安静的服务来提取类别和子类别。
  • @charlietfl 如何隐藏显示?

标签: jquery asp.net-mvc asp.net-mvc-3 c#-4.0 razor


【解决方案1】:

您可以使用 AJAX。订阅下拉列表的更改事件并触发 AJAX 请求,以传递所选类别的控制器操作。该操作将在数据库中查询相应的子类别,并返回带有相应复选框的部分视图,该复选框将被注入到 DOM 中。

因此,假设您的视图中已经有一个类别的下拉列表:

@Html.DropDownListFor(
    x => x.CategoryId, 
    Model.Categories, 
    new { 
        id = "categories",
        data_subcategoriesurl = Url.Action("subcategories", "somecontroller")
    }
)

还有一些 div 将包含页面某处的子类别:

<div id="subcategories">
    @Html.EditorFor(x => x.SubCategories, "SubCategories")
</div>

然后你可以有一个 SubCategories.cshtml 部分,它将呈现复选框列表:

@model IList<CategoryViewModel>
@{
    // we change the HTML field prefix so that input elements
    // such as checkboxes have correct names in order to be able
    // to POST the values back 
    ViewData.TemplateInfo.HtmlFieldPrefix = "SubCategories";
}
@for (var i = 0; i < Model.Count; i++)
{
    <div>
        @Html.LabelFor(x => x[i].IsSelected, Model.CategoryName)
        @Html.CheckBoxFor(x => x[i].IsSelected)
    </div>
}

现在您可以在单独的 javascript 文件中订阅下拉菜单的更改事件:

$(function() {
    $('#categories').change(function() {
        var subcategoriesUrl = $(this).data('subcategoriesurl');
        var selectedCategoryId = $(this).val();
        $('#subcategories').load(subcategoriesUrl, { id: selectedCategoryId });
    });
});

最后是 SubCategories 操作,将使用 AJAX 调用:

public ActionResult SubCategories(int? id)
{
    var subCategories = Repository.GetSubCategories(id);
    return View(subCategories);
}

【讨论】:

  • 我正在对我的应用程序进行安静的调用以获取类别和子类别,那么获取它们并显示类别下拉列表的最佳方法是什么?你能解释一下在我得到 jason 响应后我将反序列化那个对象,那么我应该如何将类别/子类别值获取到我的视图模型,这样我就可以在用户调用(GET)这些类别的页面时显示它们其他文本框,一旦用户提交表单,它就会发布所有选择以及其他文本框值。
  • @updev,这里有两种可能的方法:要么使用 AJAX 查询将返回 JSON 的 RESTful 服务,然后填充下拉选项(最初将呈现为空),要么让您的控制器操作查询服务或直接存储库以填充将传递给视图的视图模型,然后使用 DropDownListFor 帮助器呈现为下拉列表(这是我在回答中显示的内容)。就子类别而言,使用 AJAX 似乎是必要的,因为您希望每次选择更改时都刷新此复选框列表。
  • 你能帮忙定义这个场景的模型/视图模型吗?
  • 你可以有一个视图模型,它有 2 个标量属性,分别代表所选类别 id 和所选子类别 id,以及 2 个 IEnumerable&lt;SelectListItem&gt; 属性,分别代表可用类别和可用子类别。但是,我当然不知道您要实现的目标以及您要构建的应用程序的上下文和具体要求,所以我帮不上什么忙。
  • 感谢您帮助我解决这个问题。我添加了用于将 json 反序列化到对象的 json 和实体。现在,如何将包含类别和子类别的对象分配给下拉框和复选框,以便所有子类别都基于类别选择工作?
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多