HtmlHelper如何知道ViewBag上的数据?

时间:2016-03-01 22:05:24

标签: asp.net-mvc-4 html-helper

我正在观看有关DropDown https://www.youtube.com/watch?v=79aYSOcmpV8

HtmlHelper的教程

大约8分钟,他正在读取数据库以替换一些硬编码值。

  

要从控制器传递部门列表,请将它们存储在" ViewBag"

public ActionResult Index()
{
    // Connect to the database
    SampleDBContext db = new SampleDBContext();
    // Retrieve departments, and build SelectList
    ViewBag.Departments = new SelectList(db.Departments, "Id", "Name");

    return View();
}

最后一步。

  

现在进入"索引"查看,访问部门列表来自" ViewBag"

@Html.DropDownList("Departments", "Select Department") 

我在视图中看不到强类型模型。


那么Helper知道Departments如何引用ViewBag中的值?

1 个答案:

答案 0 :(得分:2)

ViewBag添加值时,在生成视图时,它还会添加到ViewData的{​​{1}}属性中。您使用的ViewContext重载相当于在

中传递DropDownList() SelectList
null

在这种情况下,在内部,帮助程序搜索@Html.DropDownList("Departments", null, "Select Department") 属性以查找匹配的密钥,该密钥是ViewDataIEnumerable<SelectListItem>是)。您可以在source code

"Departments"方法中查看相关代码
private static MvcHtmlString SelectInternal()

请注意,本教程中的示例是一种糟糕的方法,使用“魔术”字符串并要求您使用// If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); .... } 访问POST方法中的值。更好的方法是使用视图模型并强烈绑定到视图模型,例如

Request.Form["Departments"]

并且GET方法将是

public class MyViewModel
{
    public int SelectedDepartment { get; set; }
    public IEnumerable<SelectListItem> DepartmentList { get; set; }
    ...
}

并在视图中

public ActionResult Create()
{
    MyViewModel model = new MyViewModel
    {
        DepartmentList = new SelectList(db.Departments, "Id", "Name");
    };
    return View(model);
}

并将表单发回

@model MyViewModel
....
@Html.DropDownListFor(m => m.SelectedDepartment, Model.DepartmentList, "Select Department")