这可能已经被问过了一千多次,但是在尝试了10次之后我就无法理解这一点。
我正在尝试创建一个“老师”,在那里可以选择老师所在的分部。
型号:
public class CreateTeacherModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Display(Name = "Division")]
public Division Division { get; set; }
[Display(Name = "Divisions")]
public Dictionary<Guid, Division> Divisions
{
get
{
var db = new IBPVEntities();
Division = db.Division.FirstOrDefault();
return db.Division.ToDictionary(division => division.DivisionId);
}
}
控制器:
[Authorize(Roles = "Administrator")]
public ActionResult CreateTeacherTest()
{
return View(new CreateTeacherModel());
}
[Authorize(Roles = "Administrator")]
[HttpPost]
public ActionResult CreateTeacherTest(CreateTeacherModel model)
{
if (ModelState.IsValid)
{
var selectedDivision = model.Division;
// Save to database.
}
return View(model);
}
查看:
@Html.DropDownListFor(x => x.Division, new SelectList(Model.Divisions, "DivisionId", "Name"))
Division有2个属性:DivisionId(guid)和Name(string)。
我完全忘记了现在该怎么做,有人可以帮我解决这个问题吗?
提前致谢!
答案 0 :(得分:3)
为了“解决”分部,因为你的教育非常简单。在你的模型(CreateTeacherModel)中,你实际上不会使用Division作为属性类型,而是使用Guid:
public Guid DivisionId { get; set; }
并在您的控制器中,进行查找以获得实际的分部:
db.Divisions.First(x => x.Id == Model.DivisionId);
如果您需要将CreateTeacherModel转换为Entity Framework对象,您可以查看Automapper为您进行转换(这就是Stack Overflow在幕后的方式)。
如果您想获得幻想,可以注册自定义模型装订器。请参阅here以获取示例。
答案 1 :(得分:2)
@Html.DropDownListFor(
x => x.Division,
new SelectList(
Model.Divisions.ToList().Select(
x => new { Value = x.Value.DivisionId, Text = x.Value.Name }
),
"Value",
"Text"
)
)
或者您可以在视图模型中添加属性:
public IEnumerable<SelectListItem> DivisionsList
{
get
{
return Divisions.ToList().Select(
x => new SelectListItem
{
Value = x.Value.DivisionId.ToString(),
Text = x.Value.Name
}
);
}
}
然后:
@Html.DropDownListFor(x => x.Division, Model.DivisionsList)
或另一个属性在视图模型中根本不使用字典,而是直接使用:
[Display(Name = "Divisions")]
public IEnumerable<SelectListItem> Divisions
{
get
{
var db = new IBPVEntities();
Division = db.Division.FirstOrDefault();
return db.Division.ToList().Select(x => new SelectListItem
{
Value = x.DivisionId.ToString(),
Text = x.Name
});
}
}
并在您看来:
@Html.DropDownListFor(x => x.Division, Model.Divisions)