asp.net-mvc - ViewBag 幕后花絮

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

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

Controller :

    [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>

我的问题是:如果在 View 中我们没有访问ViewBag.PersonID(我们只是创建一个DropDownList,它生成一个ID =“PersonID”的html选择列表,没有任何默认选择值),那到底是怎么回事? ViewBag.PersonID 属性是否绑定(bind)到 DropDownList?幕后发生了什么?这看起来像魔法!!!

第二个问题是在发布数据时,我认为 Controller 在 View 中搜索 ID 与模型中的属性匹配的任何 html 表单字段,这就是我们在回发时获取所选 Department.PersonID 的方式,即使查看代码没有引用模型(例如 model => model.PersonID),对吗?

最佳答案

幕后花絮:

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

发帖:

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

关于asp.net-mvc - ViewBag 幕后花絮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15271316/

相关文章:

javascript - 从 Razor 表单执行 Jquery 方法

jquery - MVC 中 Html.EditorFor() 的验证

asp.net-mvc-3 - MVC3 RenderPartial 和 ViewBag

asp.net-mvc-3 - 无法在 ASP.NET MVC3 中的部分 View 中访问 ViewBag

javascript - MVC View 中的字 rune 字过多

c# - MVC Ajax 防止重定向到 Action Controller

c# - 将异步结果生成给 ASP PartialView

css - 当内容可变时,下拉菜单选项的宽度相同

带有黑色背景的 HTML 选择标记 - 下拉三 Angular 形在 Firefox 3 中不可见

android - 单击图像创建下拉菜单