Это код в интернет, например Contoso университета:ViewBag за кулисами
Контроллер:
[HttpGet]
public ActionResult Edit(int id)
{
Department department = departmentService.GetById(id);
PopulateAdministratorDropDownList(department.PersonID);
return View(department);
}
// POST: /Department/Edit/5
[HttpPost]
public ActionResult Edit(Department department)
{
try
{
if (ModelState.IsValid)
{
departmentService.Update(department);
return RedirectToAction("Index");
}
}
catch (DataException)
{
//Log the error (add a variable name after DataException)
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem
persists, see your system administrator.");
}
PopulateAdministratorDropDownList(department.PersonID);
return View(department);
}
private void PopulateAdministratorDropDownList(object selectedAdministrator = null)
{
var administrators = instructorService.GetAll().OrderBy(i => i.LastName);
ViewBag.PersonID = new SelectList(administrators, "PersonID", "FullName",
selectedAdministrator);
}
Вид:
<div class="editor-field">
@Html.DropDownList("PersonID", String.Empty)
@Html.ValidationMessageFor(model => model.PersonID)
</div>
Мой вопрос: если в представлении мы не доступ к ViewBag.PersonID (мы просто создаем DropDownList, который генерирует список выбора html с идентификатором = «PersonID», без какого-либо выбранного по умолчанию значения), как, черт возьми, свойство ViewBag.PersonID привязано к этому DropDownList? Что происходит за кулисами? Это похоже на волшебство !!!
Второй вопрос заключается в отправке данных, я думаю, что контроллер ищет в представлении для любого поля формы html, чей идентификатор соответствует свойству в модели, и именно так мы получаем выбранный Department.PersonID для обратной передачи, даже если код представления не ссылается на модель (somtheing like model => model.PersonID) правильно?