Asp.net mvc 4 将值从ViewBag传递到局部视图

Asp.net mvc 4 将值从ViewBag传递到局部视图,asp.net-mvc-4,partial-views,viewbag,Asp.net Mvc 4,Partial Views,Viewbag,因此,我的控制器代码如下: private CommunityModelsContext dbCommunities = new CommunityModelsContext(); // GET: /Home/ public ActionResult Index() { //retrieve the Communities ViewBag.Communities = dbCommunities.Communities.ToList(); return View(

因此,我的控制器代码如下:

private CommunityModelsContext dbCommunities = new CommunityModelsContext();

// GET: /Home/
public ActionResult Index()
{
     //retrieve the Communities 
     ViewBag.Communities = dbCommunities.Communities.ToList();
     return View();
}
我的观点有一条非常重要的线,那就是从局部观点开始

<div id="LeftView" class="PartialView">@{Html.RenderPartial("CommunitiesPartial");}</div>
@{Html.RenderPartial(“CommunitiesPartial”);}
在局部视图中,我正在尝试创建一个DropDownList(我还在学习,这是一个练习应用程序,只是为了看看我是否理解asp.net教程中的概念),它将获取实体列表,显示一个字段,从另一个字段获取值(“名称”和“id”)

@model BuildingManagement.Models.Community.Community
@BeginForm(“索引”,“社区控制器”)
{
@LabelFor(x=>x.Name)
@Html.DropDownList(“社区”,新选择列表(Model.Name,“id”,“Name”))
}
现在抛出一个NullReference异常,模型为null。索引页中没有模型,也没有绑定到任何东西,但是,数据是通过ViewBag发送的


请提供想法?

您的部分是强类型的模型(
BuildingManagement.Models.Community.Community
)。因此,您需要首先将此模型传递到主视图:

public ActionResult Index()
{
    //retrieve the Communities 
    ViewBag.Communities = dbCommunities.Communities.ToList();
    BuildingManagement.Models.Community.Community model = ... retrieve your model
    return View(model);
}
然后,由于您决定使用ViewBag而不是视图模型,因此您需要在局部视图中继续使用在此ViewBag中定义的值:

@Html.DropDownList("Community", new SelectList(ViewBag.Communities, "id", "Name"))
当然,更好的方法是使用视图模型:

public class CommunityViewModel
{
    [DisplayName("Name")]
    public int Id { get; set; }
    public IEnumerable<SelectListItem> Communities { get; set; }
}
@model CommunityViewModel
@using (Html.BeginForm("Index","CommunityController"))
{
    <div>
        @Html.LabelFor(x => x.Id)
        @Html.DropDownListFor(x => x.Id, Model.Communities)
    </div>
}
然后将视图和局部强类型化为视图模型:

public class CommunityViewModel
{
    [DisplayName("Name")]
    public int Id { get; set; }
    public IEnumerable<SelectListItem> Communities { get; set; }
}
@model CommunityViewModel
@using (Html.BeginForm("Index","CommunityController"))
{
    <div>
        @Html.LabelFor(x => x.Id)
        @Html.DropDownListFor(x => x.Id, Model.Communities)
    </div>
}
@model社区视图模型
@使用(Html.BeginForm(“索引”、“社区控制器”))
{
@LabelFor(x=>x.Id)
@DropDownListFor(x=>x.Id,Model.Communities)
}

您的部分是强类型的模型(
BuildingManagement.Models.Community.Community
)。因此,您需要首先将此模型传递到主视图:

public ActionResult Index()
{
    //retrieve the Communities 
    ViewBag.Communities = dbCommunities.Communities.ToList();
    BuildingManagement.Models.Community.Community model = ... retrieve your model
    return View(model);
}
然后,由于您决定使用ViewBag而不是视图模型,因此您需要在局部视图中继续使用在此ViewBag中定义的值:

@Html.DropDownList("Community", new SelectList(ViewBag.Communities, "id", "Name"))
当然,更好的方法是使用视图模型:

public class CommunityViewModel
{
    [DisplayName("Name")]
    public int Id { get; set; }
    public IEnumerable<SelectListItem> Communities { get; set; }
}
@model CommunityViewModel
@using (Html.BeginForm("Index","CommunityController"))
{
    <div>
        @Html.LabelFor(x => x.Id)
        @Html.DropDownListFor(x => x.Id, Model.Communities)
    </div>
}
然后将视图和局部强类型化为视图模型:

public class CommunityViewModel
{
    [DisplayName("Name")]
    public int Id { get; set; }
    public IEnumerable<SelectListItem> Communities { get; set; }
}
@model CommunityViewModel
@using (Html.BeginForm("Index","CommunityController"))
{
    <div>
        @Html.LabelFor(x => x.Id)
        @Html.DropDownListFor(x => x.Id, Model.Communities)
    </div>
}
@model社区视图模型
@使用(Html.BeginForm(“索引”、“社区控制器”))
{
@LabelFor(x=>x.Id)
@DropDownListFor(x=>x.Id,Model.Communities)
}