2013-03-07 2 views
3

Это код в интернет, например 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) правильно?

ответ

1

За кулисы:

мнение звонит Html.DropdownList(this HtmlHelper htmlHelper, string name, string optionLabel), который в конечном итоге заканчивается вызов SelectExtensions.SelectInternal(htmlHelper, metadata, optionLabel, expression, selectList, allowMultiple, htmlAttributes1) Это проверяет selectList1 для нуля, и если если она есть, она называет SelectExtensions.GetSelectData(htmlHelper, name), который делает волшебную часть проверки просмотреть данные для ключ соответствие имени, которое вы прошли в

проводок:.

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

Смежные вопросы