首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >幕后的ViewBag

幕后的ViewBag
EN

Stack Overflow用户
提问于 2013-03-07 20:31:15
回答 1查看 177关注 0票数 3

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

控制器:

代码语言:javascript
复制
    [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);
     }

查看:

代码语言:javascript
复制
<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),对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-07 21:58:16

幕后:

视图调用Html.DropdownList(this HtmlHelper htmlHelper, string name, string optionLabel),它最终调用SelectExtensions.SelectInternal(htmlHelper, metadata, optionLabel, expression, selectList, allowMultiple, htmlAttributes1)来检查selectList1是否为空,如果是空的,它调用SelectExtensions.GetSelectData(htmlHelper, name),后者完成检查view data中与您传入的名称匹配的键的神奇部分。

发帖:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15271316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档