ASP.NET MVC3, почему выпадающий список полагается на viewbag даже в строго типизированном представлении - PullRequest
6 голосов
/ 16 августа 2011

Я новичок в MVC, так что, возможно, это глупый вопрос - я пытаюсь разобраться со строго типизированными представлениями в asp.net mvc. Я работаю над версией 3. Если у меня есть проект с 2 моделями - скажем Персона и Отдел. Человек должен принадлежать к отделу. Итак, у меня есть модель отдела (и я сгенерировал свой контроллер и интерфейс CRUD):

public class Department
{
    public int Id { get; set;}
    public string DeparmentName { get; set;}
}

Тогда у меня есть модель Person, которая ссылается на отдел:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int Department_Id { get; set; }
    [ForeignKey("Department_Id")
    public virtual Department Department { get; set;}
}

Теперь я создаю свой контроллер и представления. Теперь, когда я смотрю на PersonController, у меня есть следующее для создания:

public ActionResult Create()
{
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
    return View();
}

и в Person \ Create.cshtml код для создания раскрывающегося списка Отдел:

@Html.DropDownList("Department_Id", String.Empty)

Насколько я понимаю, Html-помощник DropDownList использует ViewBag для создания моего выпадающего списка. Однако FirstName и LastName, кажется, имеют свои поля ввода, созданные без использования ViewBag, поэтому в моем View я могу проверять время компиляции в моих полях FirstName и LastName, потому что мое представление строго типизировано, но не в моем DropDownList.

Есть ли причина, по которой DropDownList для отдела не печатается строго или я что-то не так делаю, и есть способ сделать его строго типизированным?

Спасибо:)

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

Причина, по которой вам нужна сумка для просмотра, заключается в том, что в вашем экземпляре Person, к которому привязывается ваше представление, нет данных по всем возможным отделам, а только по одному отделу, к которому он принадлежит.Что происходит в этой строке:

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");

Это означает, что все отделы из БД добавляются в список выбора (для привязки вашего DropDown) с Id в качестве ключа asn DepartmentName в качестве значения.После того как ваше представление будет привязано к персоне, в раскрывающемся списке отобразится соответствующий отдел.

2 голосов
/ 16 августа 2011

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

public class ViewData {
   public IList<Departments> Departments {get; set;}
}

Тогда в вашем контроллере вы получите:

public ActionResult Create()
{
    ViewData model = new ViewData();
    model.Departments = db.Deparments;
    return View(model);
 }

Последним шагом является создание списка выбора и раскрывающегося списка:

@model ViewData
@SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName");
@Html.DropDownList("Department_Id", list);

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...