【问题标题】:ViewBag behind the scenesViewBag 幕后花絮
【发布时间】:2013-03-07 12:31:14
【问题描述】:

这是来自 Contoso 大学在线示例的代码:

控制器:

    [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,它会生成一个带有 ID="PersonID" 的 html 选择列表,没有任何默认选择值),那到底是怎么回事ViewBag.PersonID 属性绑定到那个 DropDownList?幕后发生了什么?这看起来像魔术!!!

第二个问题是在发布数据时,我认为控制器会在视图中搜索其 ID 与模型中的属性匹配的任何 html 表单字段,这就是我们在回发时获取所选 Department.PersonID 的方式,即使查看代码不引用模型(类似于模型 => model.PersonID)对吗?

【问题讨论】:

    标签: asp.net-mvc drop-down-menu viewbag


    【解决方案1】:

    幕后:

    视图正在调用Html.DropdownList(this HtmlHelper htmlHelper, string name, string optionLabel),最终调用SelectExtensions.SelectInternal(htmlHelper, metadata, optionLabel, expression, selectList, allowMultiple, htmlAttributes1) 这将检查selectList1 是否为空,如果是,它会调用SelectExtensions.GetSelectData(htmlHelper, name),它执行了检查视图数据中某个键的神奇部分与您传入的名称相匹配。

    发帖:

    您在这里的假设非常正确,但除了表单字段之外,框架还将检查查询字符串和路由数据以及插入管道的任何其他 IValueProvider。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2017-05-03
      相关资源
      最近更新 更多