私は一晩中、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" />
}
主な問題は、ビューにnew SelectList(Model.Grades, "ID", "Level")
がありますが、Grades
はIEnumerable<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メソッドです。Level
のint ID
プロパティにバインドしているので、int
はGrade
の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
を再割り当てする必要があることにも注意してください。
同じビューで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" })
お役に立てれば...