来自实体框架的DropDownListFor

时间:2012-02-22 13:07:54

标签: asp.net-mvc asp.net-mvc-3

这可能已经被问过了一千多次,但是在尝试了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)。

我完全忘记了现在该怎么做,有人可以帮我解决这个问题吗?

提前致谢!

2 个答案:

答案 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)