EF 4.1 + MVC Dropdownlist issues

本文关键字:Dropdownlist issues MVC EF | 更新日期: 2023-09-27 18:11:36

所以首先我试图创建ViewData["whatever"]对象,就像一样

ViewData["Blah"] = new selectList("Do cool stuff");

这导致了一个错误,即int32不是IEnummerable(没什么(;

然后我尝试了另一种方法

List<SelectItem> coolList  = db.Select(new selectItem("bunch of cool stuff"));
ViewData["Blah"] = coolLost;

这就产生了一个永远不会改变的selectedIndex。

现在是我的最后一次尝试。

我已将ICollections添加到我的模型中。已添加collectionId。

例如

public class Horse
{
    public int Id { get; set; }
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
    [Required(ErrorMessage = "Gender is required")]
    public int? GenderId { get; set; }
    public string Color { get; set; }
    public int? LegTypeId { get; set; }
    public int? CharacterId { get; set; }
    public int Hearts { get; set; }
    public bool Retired { get; set; }
    // Parents
    public int? SireId { get; set; }
    public int? DamId { get; set; }
    // Internals
    public int Stamina { get; set; }
    public int Speed { get; set; }
    public int Sharp { get; set; }
    // Special
    public int Dirt { get; set; }
    // Externals
    public int Start { get; set; }
    public int Corner { get; set; }
    public int OutOfTheBox { get; set; }
    public int Competing { get; set; }
    public int Tenacious { get; set; }
    public int Spurt { get; set; }
    //Genders
    public virtual ICollection<Gender> Genders { get; set; }
    //LegTypes
    public virtual ICollection<LegType> LegTypes { get; set; }
    //Characters
    public virtual ICollection<Character> Characters { get; set; }
    //Dams
    public virtual ICollection<Horse> Dams { get; set; }
    //Sires
    public virtual ICollection<Horse> Sires { get; set; }
    //Races
    public virtual ICollection<Race> RaceResults { get; set; }
    //Training
    public virtual ICollection<Training> TrainingResults { get; set; }
}

以及在我的cshtml文件中。

   <div class="editor-label">
            @Html.LabelFor(horse => horse.GenderId)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(horse => horse.GenderId, new SelectList(Model.Genders, "Id", "Name", Model.GenderId), "-- Fill Out --")
            @Html.ValidationMessageFor(horse => horse.GenderId)   
        </div>

这只会给我一个错误,说我有一个空引用。

我太没主意了。

然后还有一个更好的,你可以在我的模型中看到。我有一份父系和母系的名单。

但他们都是马。我怎样才能把我所有的马都列入那个名单。

提前感谢你的任何建议,这将触发灯泡在我的头脑。

现在也在尝试:

var genders = horseTracker.Genders.Select(g => new SelectListItem { Text = g.Name, Value = g.Id.ToString() }).ToList();
            var legtypes = horseTracker.LegTypes.Select(l => new SelectListItem { Text = l.Name, Value = l.Id.ToString() }).ToList();
            var characters = horseTracker.Characters.Select(c => new SelectListItem { Text = c.Name, Value = c.Id.ToString() }).ToList();
            var sires = horseTracker.Horses.Where(h => h.Gender.Equals("Male") && h.Retired.Equals(true)).Select(h => new SelectListItem { Text = h.Name, Value = h.Id.ToString() }).ToList();
            var dams = horseTracker.Horses.Where(h => h.Gender.Equals("Female") && h.Retired.Equals(true)).Select(h => new SelectListItem { Text = h.Name, Value = h.Id.ToString() }).ToList();
        ViewData["Genders"] = genders;
        ViewData["LegTypes"] = legtypes;
        ViewData["Characters"] = characters;
        ViewData["Sires"] = sires;
        ViewData["Dams"] = dams;

这给了我一个错误,说LinQ显然不能使用toString((,因为这是一个不安全的方法。

EF 4.1 + MVC Dropdownlist issues

 public ActionResult Create()
        {
            ViewData["Genders"] = new SelectList(horseTracker.Genders, "Id", "Name");
            ViewData["LegTypes"] = new SelectList(horseTracker.LegTypes, "Id", "Name");
            ViewData["Characters"] = new SelectList(horseTracker.Characters, "Id", "Name");
            ViewData["Sires"] = new SelectList(horseTracker.Horses.Where(h => h.Gender.Name.Equals("Male") && h.Retired.Equals(true)), "Id", "Name");
            ViewData["Dams"] = new SelectList(horseTracker.Horses.Where(h => h.Gender.Name.Equals("Female") && h.Retired.Equals(true)), "Id", "Name");
            return View();
        }
<div class="editor-label">
            @Html.LabelFor(horse => horse.GenderId)
        </div>
        <div class="editor-field">
            @Html.DropDownList("Id", (SelectList)ViewData["Genders"])
            @Html.ValidationMessageFor(horse => horse.GenderId)   
        </div>

获取正在运行和填充的页面。而是在创造马上。所选值为null。

以下是如何在MVC3中使用下拉列表的简单示例。

您应该创建这样的视图模型:

public class HorseViewModel
{
    [Required(ErrorMessage = "Please give the horse a name.")]
    public string Name { get; set; }
    [Required(ErrorMessage = "Please select a gender.")]
    public int SelectedGenderId { get; set; }
    public ICollection<Gender> Genders { get; set; }
}

在您的控制器中:

[HttpGet]
public ActionResult Horses()
{
    var model = new HorseViewModel { Horses = db.Genders.ToList() }
    return View(model);
}

在您的模型中:

@model MvcProject.Models.HorseViewModel
@using (Html.BeginForm()) {
    <div class="editor-label>
        @Html.LabelFor(m => m.Name)
    </div>
    <div class="editor-field>
        @Html.EditorFor(m => m.Name)
        @Html.ValidationMessageFor(m => m.Name)
    </div>
    <div class="editor-label>
        @Html.LabelFor(m => m.SelectedGenderId)
    </div>
    <div class="editor-field>
        @Html.DropDownListFor(m => m.SelectedGenderId,
                              new SelectList(Model.Genders, "Id", "DisplayName"),
                              "-- Select Gender --")
        @Html.ValidationMessageFor(m => m.SelectedGenderId)
    </div>
    <p><input type="submit" value="Submit"/></p>
}

这应该会给你一个表格,将所选的性别id张贴回控制器。

实际上,

我修复了它,解决方案比我预期的要简单得多。

    ViewData["Genders"] = new SelectList(horseTracker.Genders, "Id", "Name");
    ViewData["LegTypes"] = new SelectList(horseTracker.LegTypes, "Id", "Name");
    ViewData["Characters"] = new SelectList(horseTracker.Characters, "Id", "Name");
    ViewData["Sires"] = new SelectList(horseTracker.Horses.Where(h => h.Gender.Name.Equals("Male") && h.Retired.Equals(true)), "Id", "Name");
    ViewData["Dams"] = new SelectList(horseTracker.Horses.Where(h => h.Gender.Name.Equals("Female") && h.Retired.Equals(true)), "Id", "Name");

这个在cshtml 中

@Html.DropDownListFor(horse => horse.GenderId, (SelectList)ViewData["Genders"])