关于asp.net:Html.DropDownList用于设置所选值

Html.DropDownListFor set selected value

我创建一个@ Html.DropDownListFor并从数据库中填充它。 如何为下拉菜单设置选定的值?

我的看法:

1
2
@Html.DropDownListFor(m => m.Forms, new SelectList(Model.Forms,"FormsCreatorID","FormName"),
           "Select a Form", new { @class ="form-control" })

我的控制器:

1
2
3
var forms = db.formscreators.Where(fp => fp.PropertyID == id || fp.PropertyID == 0)
            .OrderByDescending(x => x.PropertyID).GroupBy(x => x.FormName).Select(x => x.FirstOrDefault()).ToList();
var viewModel = new ListFormsCreator { Forms = forms };

我的ViewModel:

1
2
3
4
public class ListFormsCreator
{
    public List<formscreator> Forms { get; set; }
}

我的数据库模型:

1
2
3
4
5
6
public partial class formscreator
{
    public int FormsCreatorID { get; set; }
    public string FormName { get; set; }
    public int PropertyID { get; set; }
}

谢谢


您应该在控制器上设置" Selected"值来生成" SelectListItem"列表,并通过ViewBag或ViewModel传递它。在我的示例中,为简单起见,我使用了ViewBag。
这是缩短的控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public ActionResult Edit(int? id)
{
    if (id == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    Album album = context.Albums.Find(id);

    if (album == null)
    {
        return HttpNotFound();
    }

    ViewBag.GenreId = context.Genres.Select(
        g => new SelectListItem()
        {
            Value = g.GenreId.ToString(),
            Text = g.Name,
            Selected = g.GenreId == album.GenreId ? true : false
        }).ToList();

    return View(album);
}

这是缩短的查看代码

1
2
3
@using MvcMusicStore2017.Models;
@model Album
@Html.DropDownList("GenreId", null, new { @class ="form-control" })

更新viewModel并为下拉选择的值添加一个Int SelectId。

在您的控制器中:

1
var viewModel = new ListFormsCreator { SelectId = PropertyId, Forms = FormSelectList(forms, PropertyId.ToString()) };

我将创建一个传递列表的函数:

1
2
3
4
5
6
7
8
9
10
    public static SelectList FormSelectList(IEnumerable<formscreators> types, string selected = null)
    {
        return new SelectList(from f in forms
                              select new SelectListItem
                              {
                                  Text = f.FormName,
                                  Value = f.FormsCreatorID.ToString()
                              },"Value","Text", selected);

    }

并在您的.cshtml中

1
@Html.DropDownListFor(m => m.PropertyId, Model.forms,"Select a Form", new { @class ="form-control", required ="required" })


您应该为视图模型添加另一个属性以存储/传递所选选项。

1
2
3
4
5
public class ListFormsCreator
{
    public int SelectedFormId  { set;get;}
    public List<formscreator> Forms { get; set; }
}

现在,在GET操作中,您可以设置该值

1
2
3
var viewModel = new ListFormsCreator() { Forms = forms };
viewModel.SelectedFormId  = 2 ; // This will select the option with 2 as FormsCreatorID
return View(viewModel);

在视图中,将具有该属性的lamda表达式用作DropDownListFor helper方法的第一个参数。

1
2
3
4
5
@model ListFormsCreator

@Html.DropDownListFor(m => m.SelectedFormId  ,
                         new SelectList(Model.Forms,"FormsCreatorID","FormName"),
                       "Select a Form", new { @class ="form-control" })

DropDownListFor帮助器方法将使用SelectedFormId属性的值,并从该SELECT元素的选项列表中选择具有相同value属性值的选项。

您还可以通过用SelectListItem列表替换它来从视图模型中删除对formscreator类的依赖关系

1
2
3
4
5
public class ListFormsCreator
{
    public int SelectedFormId  { set;get;}
    public List<SelectListItem> Forms { get; set; }
}

现在,在GET操作中,可以使用Select方法从其他集合中生成SelectListItem的lsit。

1
2
3
4
5
6
7
var viewModel = new ListFormsCreator();
viewModel.Forms = someCollection.Select(a=>new SelectListItem {
                                           Value=a.FormsCreatorId.ToString(),
                                           Text=a.FormName})
                 .ToList();
viewModel.SelectedFormId  = 2 ; // This will select the option with 2 as FormsCreatorID
return View(viewModel);

假设someCollectionformscreator对象的集合
现在在视图中的代码要简单得多

1
@Html.DropDownListFor(m => m.SelectedFormId, Model.Forms ,"Select a Form")


  • 符合C#/。NET命名约定:

  • formscreator重命名为formscreator
  • ID替换ID(因为它是缩写,而不是缩写)
  • ListFormsCreator重命名为类似ListFormsCreatorViewModel的名称,因此很明显,它是ViewModel类型而不是Model / Entity类型。
  • 修改您的ViewModel以添加属性以存储所选的FormsCreatorId值:

    1
    2
    3
    4
    5
    6
    7
    public class ListFormsCreatorViewModel
    {
        [Required] // add or remove the 'Required' attribute as necessary
        public int? SelectedFormsCreatorId { get; set; }

        ...
    }
  • 如果知道值应该在控制器动作中设置SelectedFormsCreatorId属性值。

  • POST处理程序中,通过直接通过View(Object viewModel)方法将model动作参数直接传递回来或手动重新填充来确保SelectedFormsCreatorId值得到维护。

  • DropDownListFor中的view-model属性应为SelectedFormsCreatorId属性。您不需要new SelectList(...)

    1
    @Html.DropDownListFor( m => m.SelectedFormsCreatorId, this.Model.Forms );