我正在构建我的第一个管理片段的MVC(3)应用程序。
显然我有一个片段的编辑页面,它有一个编程语言(0. *到0.1)。
现在我的问题是,如何构建一个包含所有当前编程语言的列表框,以便在我的编辑页面上显示一个片段?
我想我可以创建一个ViewModel,并通过手动查询并将它们作为列表传递来填充所有值,但我觉得构建MVC的人对此有一个更整洁的解决方案?我在Apress手边有“Pro MVC 3”和“Pro Entity Framework”,但似乎无法找到答案。
当我尝试:
@Html.EditorFor(model => model.Language or model.Language.Name)
我收到错误。
在此先感谢,任何帮助表示赞赏!
答案 0 :(得分:0)
以下是我在类似情况下所做的事情: 1)创建用于编辑语言的视图模型
public class LanguagesModel
{
public IEnumerable<int> SelectedLanguageIds { get; set; }
public MultiSelectList languages { get; set; }
}
2)在控制器中填充模型:
public ActionResult Index()
{
List<Language> languages = _languageService.GetLanguages();//however you get the languages from your datasource
var temp = new MultiSelectList(
languages.Select(l => new { Value = l.LanguageId.ToString(), Text = l.Name }),
"Value",
"Text");
LanguagesModel model = new LanguagesModel();
model.languages = temp;
return View(model);
}
3)创建一个使用DropDownListFor帮助器的视图:
@model LanguagesModel
@using (Html.BeginForm(Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })))
{
@Html.ValidationSummary(true)
<fieldset>
@Html.ListBoxFor(m => m.SelectedLanguageIds, Model.languages)
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
通过您实际使用的动作和控制器替换“索引”和“主页”。
编辑更改代码以使用ListBox而不是DropDownList。灵感来自Darin Dimitrov的回答
答案 1 :(得分:0)
我想我可以创建一个ViewModel
直截了当!这正是我建议你做的。
但是如果你想坚持你的域模型你可以在视图中做一些调整,以便能够使用ListBox助手(完全不推荐的解决方案,但因为你要求更多的东西整洁根据您的标准):
@model Snippet
@Html.ListBox(
"SelectedIds",
new MultiSelectList(
Model.Languages.Select(l => new { Value = l.ID.Tostring(), Text = l.Name }),
"Value",
"Text"
)
)