DropDownListFor от Entity Framework - PullRequest
       2

DropDownListFor от Entity Framework

0 голосов
/ 22 февраля 2012

Это, вероятно, уже просили более тысячи раз, но я просто не могу разобраться с этим после попытки более 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"))

Отдел имеет2 свойства: DivisionId (guid) и Name (строка).

Я совершенно не понял, что делать сейчас, может кто-нибудь помочь мне в этом?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

«Урегулировать» дивизию, как вы указали, довольно просто. В вашей модели (CreateTeacherModel) вы фактически не используете Division в качестве типа свойства, а вместо этого используете Guid:

public Guid DivisionId { get; set; }

и в вашем контроллере выполните поиск, чтобы получить фактическое деление:

db.Divisions.First(x => x.Id == Model.DivisionId);

Если вам нужно преобразовать CreateTeacherModel в объект Entity Framework, вы можете заглянуть в Automapper , чтобы выполнить преобразование за вас (именно так Stack Overflow делает это за кулисами).

Если вам захочется пофантазировать, вы можете зарегистрировать пользовательскую модель переплета. см. здесь для примера.

2 голосов
/ 22 февраля 2012
@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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...