[英]Convert Linq query in repository to SelectListItem of ViewModel type
我正在嘗試使用EditorFor在視圖中填充下拉列表,並在視圖模型上使用下拉模板和UIHint。
下拉列表在viewmodel中定義為IEnumerable。
視圖模型
public partial class FilmEditViewModel
{
public int filmID { get; set; }
public IEnumerable<SelectListItem> filmName { get; set; }
public string releaseDate { get; set; }
}
存儲庫具有應返回IEnumerable的GetSelect方法。
知識庫
public IEnumerable<SelectListItem> GetSelect()
{
IEnumerable<SelectListItem> films = (from f in objContext.tFilm
orderby f.filmName
select new SelectListItem
{
Text = f.filmName,
Value = SqlFunctions.StringConvert((double?)f.filmID)
});
return films;
}
然后,控制器創建一個新的ViewModel實例,並從GetSelect中填充列表。
調節器
public ActionResult Create()
{
var model = new FilmEditViewModel
{
filmName = _repo.GetSelect()
};
return View(model);
//IEnumerable<SelectListItem> films = _repo.GetSelect();
//var model = new FilmEditViewModel
//{
// filmName = films.Select(f => new SelectListItem
// {
// Value = f.Value,
// Text = f.Text
// })
//};
}
頂部的代碼是我期望的工作方式。 下面的注釋代碼是我嘗試更加明確的地方。
都不行。
它們返回以下形式的錯誤:
傳遞到字典中的模型項的類型為'System.Data.Entity.Infrastructure.DbQuery`1 [System.Web.Mvc.SelectListItem]',但是此字典需要類型為'FilmStore.ViewModels.FilmEditViewModel'的模型項
如何將查詢轉換為可以傳遞到ViewModel的SelectListItem?
其他信息,以防萬一...
下拉模板
@model FilmStore.ViewModels.FilmEditViewModel
@Html.DropDownListFor(o => o.filmName, new SelectList(Model.filmName, "Text", "Value"))
Create.cshtml
@using BootstrapSupport
@model Object
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset class="form-horizontal">
<legend>@Model.GetLabel() <small>Details</small></legend>
@foreach (var property in Model.VisibleProperties())
{
using(Html.ControlGroupFor(property.Name)){
//changed first argument for label to show Validation.cs properties
@Html.Label(property.GetLabel(), new { @class = "control-label" })
<div class="controls">
@Html.Editor(property.Name, new { @class = "input-xlarge" })
@Html.ValidationMessage(property.Name, null, new { @class = "help-inline" })
</div>
}
}
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save changes</button>
@Html.ActionLink("Cancel", "Index", null, new { @class = "btn " })
</div>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section scripts {
<script type="text/javascript">
$("[id$='Date']").datepicker(
{format: "dd/mm/yyyy" }
);
</script>
}
-------編輯答案-------- Mariusz的以下解決方案對其他地方的代碼進行了一些調整。
我必須稍微修改Controller,然后清理存儲庫中的代碼。 以下更改:
知識庫
public IEnumerable<SelectListItem> GetSelect()
{
return from f in objContext.tFilm
orderby f.filmName
select new SelectListItem
{
Text = f.filmName,
Value = SqlFunctions.StringConvert((double?)f.filmID)
};
}
調節器
public ActionResult Create()
{
var model = new FilmEditViewModel();
FilmDropDownViewModel films = new FilmDropDownViewModel
{
Items = _repo.GetSelect(),
};
model.filmName = films;
return View(model);
}
您的下拉模板需要使用FilmStore.ViewModels.FilmEditViewModel
類型的模型,但是您正在傳遞影片集合。 如果要為其創建EditorTemplate,請使用具有所選值和膠片集合ID的另一個視圖模型。
例如
public class DropDownVM
{
public int PickedId {get; set;}
public IEnumerable<SelectListItem> Items {get;set;}
}
public class FilmEditViewModel
{
public string releaseDate { get; set; }
public DropDownVM films {get;set;}
}
//Template view
@model DropDownVM
@Html.DropDownListFor(m => m.PickedId, new SelectList(Model.Items , "Text", "Value"))
//View
@model FilmEditViewModel
//...form etc.
@Html.EditorFor(m =>m.films)
您應該按原樣填充列表,但是您缺少下拉列表中所選值的占位符,例如ChosenFilmId。
@Html.DropDownListFor(o => o.ChosenFilmId, Model.filmName)
在發布操作中,您將找到ChosenFilmId字段中包含的選定值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.