【问题标题】:ASP.NET MVC3, why does dropdownlist rely on viewbag even in a strongly typed viewASP.NET MVC3,为什么即使在强类型视图中下拉列表也依赖viewbag
【发布时间】:2011-08-16 08:30:45
【问题描述】:

我是 MVC 的新手,所以这可能是一个愚蠢的问题 - 我试图了解 asp.net mvc 中的强类型视图。我正在开发版本 3。 如果我有一个包含 2 个模型的项目 - 比如说 Person 和 Department。一个人必须属于一个部门。所以我有我的部门模型(并且我已经生成了我的控制器和 CRUD 接口):

public class Department
{
    public int Id { get; set;}
    public string DeparmentName { get; set;}
}

然后我有一个引用 Department 的 Person 模型:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int Department_Id { get; set; }
    [ForeignKey("Department_Id")
    public virtual Department Department { get; set;}
}

现在我生成我的控制器和视图。现在,当我查看 PersonController 时,我的 Create 有以下内容:

public ActionResult Create()
{
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
    return View();
}

在 Person\Create.cshtml 中,创建部门下拉列表的代码是

@Html.DropDownList("Department_Id", String.Empty)

据我了解,DropDownList Html 助手正在使用 ViewBag 创建我的下拉列表。但是,FirstName 和 LastName 似乎在不依赖 ViewBag 的情况下创建了它们的输入字段 - 所以在我的视图中,我可以在编译时检查我的 FirstName 和 LastName 字段,因为我的视图是强类型的,但不是在我的 DropDownList 上。

是否有原因导致部门的 DropDownList 没有强类型化,或者我做错了什么并且有办法使其强类型化?

谢谢:)

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 c#-4.0 drop-down-menu strongly-typed-view


    【解决方案1】:

    您需要 viewbag 的原因是您的 Person 实例(您的视图绑定到的)没有所有可能部门的数据,只有它所属的一个部门。这一行发生了什么:

    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
    

    数据库中的所有部门是否都添加到选择列表(供您的下拉菜单绑定到),ID 为键,部门名称为值。将视图绑定到 Person 后,下拉列表将显示相应的部门。

    【讨论】:

    • 嗨 Edwin - 谢谢 - 这有点道理 - 一个人有一个 Department_ID,但我认为该视图绑定到我的 Person 模型,该模型通过“虚拟”定义与部门的关系财产?也许我只是在 MVC 框架中寻找太多的“魔法”。
    • @Rick:我猜你会的。该视图仅绑定到您的 Person 定义的单个部门。您使用 viewbag 来传输部门的完整列表。顺便说一句,ViewBag 只是 ViewData 的一个包装器(来自另一个答案),允许您创建动态属性。
    【解决方案2】:

    如果你使用强类型视图,你应该有一个强类型模型,并传递给视图:

    public class ViewData {
       public IList<Departments> Departments {get; set;}
    }
    

    然后在你的控制器中你有:

    public ActionResult Create()
    {
        ViewData model = new ViewData();
        model.Departments = db.Deparments;
        return View(model);
     }
    

    最后一步是创建选择列表并下拉视图:

    @model ViewData
    @SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName");
    @Html.DropDownList("Department_Id", list);
    

    希望这是有道理的。

    【讨论】:

    • 嗨史蒂夫 - 谢谢 - 你创建的 ViewData 类是一个“ViewModel”吗?
    • 是的,我一般把所有的视图模型都放在解决方案的models文件夹下。通常我将它们命名为 {viewName}ViewData.cs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多