0

我正在尝试使用 EditorFor 在视图中填充下拉列表,并使用视图模型上的下拉模板和 UIHint。

下拉列表在视图模型中定义为 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"))

创建.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的以下解决方案对其他地方的代码进行了一些调整。

我不得不稍微修改一下控制器,并清理了存储库中的代码。以下更改:

存储库

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

2 回答 2

1

您的下拉模板需要类型的模型,FilmStore.ViewModels.FilmEditViewModel但您正在传递电影集合。如果您想为其制作编辑器模板,请制作另一个具有所选值的 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)
于 2013-09-24T12:45:15.263 回答
0

您正在按照应有的方式填写列表,但是您缺少下拉列表中所选值的占位符,例如 ChosenFilmId。

@Html.DropDownListFor(o => o.ChosenFilmId, Model.filmName)

在 post 操作中,您将找到包含在 ChosenFilmId 字段中的所选值

于 2013-09-24T11:00:06.597 回答