MVC如何在不使用模型的情况下填充下拉列表

时间:2014-10-22 00:09:07

标签: forms asp.net-mvc-4 model-view-controller

我正在使用mvc 4,我在视图中有一个表单(没有绑定到模型),它使用标准的html元素。

我想从列表值中填充下拉列表(即从控制器操作返回)

也基于第一个下拉列表中的值的选择我要填充第二个下拉列表

有人可以指导

2 个答案:

答案 0 :(得分:0)

对于第一个下拉列表,您循环遍历所有可用选项并在<option>内添加<select>标记,以获取第二个下拉列表,您需要进行一些下拉并隐藏/显示它们,或者您创建一个大的列表,并根据第一个列表的选择删除无效的条目。你肯定需要为第二个列表做javascript。

答案 1 :(得分:0)

如果您不想使用模型(您应该),则必须将项目添加到ViewData 我会为你找出一些东西,你可以完成剩下的工作。

在控制器内部,创建所需内容的列表对象。如果您使用的是EntityFrameWork,这看起来很熟悉。

var list = context.Table.ToList();   

List<System.Web.Mvc.SelectListItem> ddlItems = new List<System.Web.Mvc.SelectListItem>();

foreach (var item in list)
{
   ddlItems.Add(new SelectListItem(){ Text = item.Text, Value = item.Value.ToString()});
} 

ViewData["DDLItems"] = ddlItems;


@Html.DropDownListFor(x => x.LeagueId, 
 new SelectList((System.Collections.IEnumerable)ViewData["DDLItems"], "Value", "Text")
 , "--Select League--", new { id = "league" })

您可以使用占位符定义第二个下拉列表,直到级联效果发生。

@Html.DropDownListFor(x => x.DivisionId, Enumerable.Empty<SelectListItem>(), 
                       "--Select Division--", new { id = "ddlDivision" })

当下拉列表更改时,您将需要使用JQuery和fire和event,然后使用Ajax向控制器发出回调。 Theres 2348239在线关于进行Ajax调用的示例,知道如何做到这一点,因为它一直在MVC中完成。

我会让你想出那部分。一个提示,在Ajax调用中,您可以将数据传递给控制器​​。像这样的data: { leagueId: value },其中value是你想要级联的下拉列表的值。 leagueId 必须匹配控制器所期望的参数的类型和名称。

从控制器返回Json对象,如此......

public JsonResult GetDivisions(int leagueId)
{
    var division = //similar to before, fill a list.  

    return Json(divisions, JsonRequestBehavior.AllowGet);
}

然后在Ajax调用的成功函数中,您将填充Second下拉列表。

success: function (data) {                                                  

   $.each(data, function (index, item)    

 $('#ddlDivision')
            .append($('<option></option>')
            .val(item.Value)
            .html(item.Text))

item.Valueitem.Text可以是任何内容,只要您返回的Json作为TextValue的属性

... IE

 var divisions = (from x in context.Division
                                 select new
                                 {
                                     Text = league + " " + x.Region,
                                     Value = x.DivisionId
                                 }).ToList();