我创建一个@ 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; }
}
由于
答案 0 :(得分:1)
formscreator
重命名为FormsCreator
ID
替换为Id
(因为它是缩写,而非初始主义)ListFormsCreator
重命名为类似ListFormsCreatorViewModel
的内容,因此很明显它是ViewModel类型,而不是模型/实体类型。修改ViewModel以添加属性以存储选定的FormsCreatorId
值:
public class ListFormsCreatorViewModel
{
[Required] // add or remove the 'Required' attribute as necessary
public int? SelectedFormsCreatorId { get; set; }
...
}
如果您知道该值应该是什么,请在控制器操作中设置SelectedFormsCreatorId
属性值。
在POST
处理程序中,确保维护SelectedFormsCreatorId
值,方法是直接通过model
方法传递View(Object viewModel)
操作参数或手动重新填充它。
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);
假设someCollection
是formscreator
个对象的集合
现在在视图中代码更简单
@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" })