web-dev-qa-db-ja.com

Entity Framework 6とViewModelを使用して、データベーステーブルからASP.NET MVCのDropDownListを作成します。

私は一晩中、ajax/jqueryとストアドプロシージャを使用してすばやく実行できる問題について頭を悩ませています。したい

1)Entity Frameworkとビューモデルを使用して、データベーステーブルから取得した値からドロップダウンリストを作成します。 VIEWBAGを使用したくないOR VIEWDATA。

2)すべてのデフォルトフィールドを持つビューモデルを使用して、どのようにしてビューの作成を生成できますか?スキャフォールディングはモデルでは機能しますが、ビューモデルでは機能しませんか?

マイモデル

public class Employee
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
    public string City { get; set; }
    public string Level { get; set; }
    public int DepartmentId { get; set; }
}

public class Grade
{
    public int ID { get; set; }
    public string Level { get; set; }
}

モデルを表示

public class GradeSelectListViewModel
{

    public Employee Employee { get; set; }
    public IEnumerable<SelectListItem> Grades { get; set; }
    public GradeSelectListViewModel(Employee employee, IEnumerable grades)
    {
        Employee = employee;
        Grades = new SelectList(grades, "Grade", "Name", employee.Level);
    }
}

マイコンテキストクラス

public class EmployeeContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Grade> Grades { get; set; }
}

マイコントローラー

public ActionResult Edit (int? id)
{
    using (var db = new EmployeeContext())
    {
        var model = new GradeSelectListViewModel(db.Employees.Find(id), db.Grades);
        //model.Employee = db.Employees.Single(x => x.EmployeeID == id);
        model.Grades = db.Grades.ToList().Select(x => new SelectListItem
        {
            Value = x.ID.ToString(),
            Text = x.Level
        });
        return View(model);
    }
}

私のかみそりページCSHTML

@model MVCDemo.ViewModels.GradeSelectListViewModel
....
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    ....
    @Html.DropDownListFor(x => Model.Employee.Level,
        new SelectList(Model.Grades, "ID", "Level"),
        "Select Level")
    ....
    <input type="submit" value="Create" class="btn btn-default" />
}
4
TropicalViking

主な問題は、ビューにnew SelectList(Model.Grades, "ID", "Level")がありますが、GradesIEnumerable<SelectListItem>であり、SelectListItemにはIDおよびLevelという名前のプロパティが含まれていません。

ただし、コードには他にもいくつか問題があります。まず、ビューモデルにはデータモデルを含めないでください。代わりに、ビューモデルは

public class GradeSelectListViewModel
{
    public int? ID { get; set; } // make this ID so you do not need an input for it
    public string Name { get; set; }
    .... // other properties of Employee that your editing
    [Required(ErrorMessage = "..")]
    public int? Level { get; set; } // make value types nullable to protect against under-posting attacks
    public IEnumerable<SelectListItem> Grades { get; set; }
}

必要に応じて、表示属性と検証属性を追加します。コンストラクタを削除したことに注意してください(使用していないようですが、使用した場合は、パラメータなしのコンストラクタも含める必要があります。そうしないと、POSTメソッドです。Levelint IDプロパティにバインドしているので、intGradeのtypeofであると想定しています。

GETメソッドのコードは

Employee employee = db.Employees.Find(id);
var model = new GradeSelectListViewModel()
{
    ID = employee.EmployeeID,
    Name = employee.Name,
    Level = employee.Level, // convert to int?
    ....
    Grades = db.Grades.Select(x => new SelectListItem
    {
        Value = x.ID.ToString(),
        Text = x.Level
    })
};
return View(model);

とビューで

 @Html.DropDownListFor(x => Model.Level, Model.Grades, "Select Level")

POSTメソッドでは、SelectListが無効であるため、ビューを返す場合、ModelStateを再割り当てする必要があることにも注意してください。

7
user3559349

同じビューで3つのDropDownListForを生成する次のアプローチを使用できます。

ViewModel:

public class GroupViewModel
{  
    public IEnumerable<SelectListItem> Schedules { get; set; }
    public int ScheduleId { get; set; }

    public IEnumerable<SelectListItem> Labs { get; set; }
    public int LabId { get; set; }

    public IEnumerable<SelectListItem> Terms { get; set; } 
    public int TermId { get; set; }
}



コントローラ:

public ActionResult Create()
{
    //Populate DropDownList binding values
    var model = new GroupViewModel
    {
        //Preselect the Lab with id 2
        //LabId = 2,

        Labs = repository.Labs.Select(c => new SelectListItem
        {
            Value = c.Id.ToString(),
            Text = c.Name
        }),
        Terms = repository.Terms.Select(c => new SelectListItem
        {
            Value = c.Id.ToString(),
            Text = c.Name
        }),
        Schedules = repository.Schedules.Select(c => new SelectListItem
        {
            Value = c.Id.ToString(),
            Text = c.Name
        })
    };
    return View("Create", model);
}



表示:

@Html.DropDownListFor(m => m.LabId, new SelectList(Model.Labs, "Value", "Text"), 
    "Select", new { @class = "selectpicker" })

@Html.DropDownListFor(m => m.ScheduleId, new SelectList(Model.Schedules, "Value", "Text"), 
    "Select", new { @class = "selectpicker" })

@Html.DropDownListFor(m => m.TermId, new SelectList(Model.Terms, "Value", "Text"), 
    "Select", new { @class = "selectpicker" })

お役に立てれば...

1
Murat Yıldız