Html.DropDownListFor设置选定值

时间:2017-12-07 19:32:31

标签: asp.net asp.net-mvc

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

我的观点:

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

我的控制器:

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:

public class ListFormsCreator
{
    public List<formscreator> Forms { get; set; }
}

我的数据库模型:

public partial class formscreator
{
    public int FormsCreatorID { get; set; }
    public string FormName { get; set; }
    public int PropertyID { get; set; }
}

由于

4 个答案:

答案 0 :(得分:1)

  1. 符合C#/ .NET命名约定:
    1. formscreator重命名为FormsCreator
    2. ID替换为Id(因为它是缩写,而非初始主义)
    3. ListFormsCreator重命名为类似ListFormsCreatorViewModel的内容,因此很明显它是ViewModel类型,而不是模型/实体类型。
  2. 修改ViewModel以添加属性以存储选定的FormsCreatorId值:

    public class ListFormsCreatorViewModel
    {
        [Required] // add or remove the 'Required' attribute as necessary
        public int? SelectedFormsCreatorId { get; set; }
    
        ...
    }
    
  3. 如果您知道该值应该是什么,请在控制器操作中设置SelectedFormsCreatorId属性值。

  4. POST处理程序中,确保维护SelectedFormsCreatorId值,方法是直接通过model方法传递View(Object viewModel)操作参数或手动重新填充它。

  5. DropDownListFor中的视图模型属性应为SelectedFormsCreatorId属性。您不需要new SelectList(...)

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

答案 1 :(得分:1)

您应该为商店的视图模型添加另一个属性/传递所选选项。

public class ListFormsCreator
{
    public int SelectedFormId  { set;get;}
    public List<formscreator> Forms { get; set; }
}

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

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

在视图中使用带有该属性的lamda表达式作为DropDownListFor辅助方法的第一个参数。

@model ListFormsCreator

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

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

您还可以从视图模型中删除对formscreator类的依赖关系,方法是将其替换为SelectListItem

列表
public class ListFormsCreator
{
    public int SelectedFormId  { set;get;}
    public List<SelectListItem> Forms { get; set; }
}

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

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个对象的集合 现在在视图中代码更简单

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

答案 2 :(得分:1)

更新您的viewModel并为下拉列表选择值添加Int SelectId。

在您的控制器中:

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

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

    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中

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

答案 3 :(得分:1)

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

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);
}

这是缩短的查看代码

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