让我先问问题。
调用加载要在视图上显示的值列表的函数的正确位置在哪里?
我创建了一个像这样的控制器
public ActionResult Create()
{
SeaModel newSea = new SeaModel();
return View("Season/CreateSea", newSea);
}
//I not quite sure if this should go here or in another place
partial class seaDataContext
{
public List<string> getSeaSettings()
{
var seaSettings = from p in settings
where p.setting == "periods"
select p.value;
return seaSettings.ToList<string>();
}
}
模型就像
public class SeaModel
{
[Required(ErrorMessage="*")]
[Display(Name = "Period Name")]
public string periods { get; set; }
}
创建像
这样的视图 @using (Html.BeginForm()) {
@Html.ValidationSummary(true, "Please correct the following errors.")
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
@Html.LabelFor(model => model.periods)
</div>
<div class="editor-field">
@Html.Select(model => model.periods, ****My doubt comes here****)
@Html.ValidationMessageFor(model => model.periods)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
那么,我如何以及在何处将getSeaSettings()的返回传递给视图?
由于
答案 0 :(得分:4)
最佳做法是在模型中为此下拉列表创建一个选择列表。
但是您也可以使用更简单的选项:使用ViewData
public ActionResult Create()
{
SeaModel newSea = new SeaModel();
ViewData["myDropDown"] = new SelectList(listOfObjects, "valueOfTheObjectLikeID", "NameYouWantToShowInDropdown");
return View("Season/CreateSea", newSea);
}
然后:
@Html.Select(model => model.periods, ViewData["myDropDown"] as SelectList)
如果您的验证失败,请不要忘记在您的[HttpPost]方法中也填写viewdata,因此可以重建下拉列表。
答案 1 :(得分:2)
您需要查看存储库模式。在asp.net网站上看看这个教程 http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-cs
答案 2 :(得分:2)
Stefanvds 的方法就像我以前那样
但我发现使用 additionalViewData
有更好的方式
使用此EditorFor HTML Helper扩展方法。
http://msdn.microsoft.com/en-us/library/ff406462.aspx
您可以在查看中执行此操作,而不是将选择列表项传递到控制器中的 ViewData 。
将您的列表项作为additionalViewData
参数的匿名对象传递
重要的是使用同名作为您的物业名称。
@Html.EditorFor(
m => m.MyPropertyName,
new { MyPropertyName = Model.ListItemsForMyPropertyName }
);
当然,您传递的是View Model对象。
public class MyViewModel
{
public int MyPropertyName;
public IList<SelectListItem> ListItemsForMyPropertyName;
}
EditorFor
方法使用您现有的编辑器视图模板
因此,您不需要像使用Html.DropDown()方法那样再次指定CSS类名和HTML属性。
例如,
//------------------------------
// additionalViewData
//------------------------------
@Html.EditorFor(
m => m.MyPropertyName,
new { MyPropertyName = Model.ListItemsForMyPropertyName }
)
//------------------------------
// traditional approach requires to pass your own HTML attributes
//------------------------------
@Html.DropDown(
"MyPropertyName",
Model.ListItemsForMyPropertyName,
new Dictionary<string, object> {
{ "class", "myDropDownCssClass" }
}
);
//------------------------------
// DropDownListFor still requires you to pass in your own HTML attributes
//------------------------------
@Html.DropDownListFor(
m => m.MyPropertyName,
Model.ListItemsForMyPropertyName,
new Dictionary<string, object> {
{ "class", "myDropDownCssClass" }
}
);
这就是我更喜欢additionalViewData
方法的原因
因为,呈现的HTML代码完全依赖于编辑器模板。
此外,使用专门的View Models可以使您的代码更清晰,更易于维护。
希望它有所帮助。