将值从ViewBag传递到部分视图

时间:2012-10-19 07:02:54

标签: asp.net-mvc-4 partial-views viewbag

所以我的Controller的代码如下:

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>

在Partial视图中,我正在尝试创建一个DropDownList(我还在学习,这是一个练习应用,只是为了看看我是否理解了asp.net教程中的概念),然后获取此实体列表,显示一个字段,从其他(“名称”和“ID”)

获取值
@model BuildingManagement.Models.Community.Community

@Html.BeginForm("Index","CommunityController")
{
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.DropDownList("Community" , new SelectList(Model.Name,"id","Name"))
    </div>
}

现在抛出一个NullReference异常,模型为null。索引页面中没有模型,它没有绑定任何模型,但是,数据是通过ViewBag发送的。

想法好吗?

1 个答案:

答案 0 :(得分:3)

您的部分内容强烈输入模型(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而不是视图模型,您需要继续使用您在partial中的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; }
}

然后让控制器填充视图模型并将此视图模型传递给视图:

public ActionResult Index()
{
    //retrieve the Communities 
    var communities = dbCommunities.Communities.ToList().Select(x => new SelectListItem
    {
        Value = x.Id.ToString(), 
        Text = x.Name
    })
    var model = new CommunityViewModel
    {
        Communities = communities
    }
    return View(model);
}

然后将您的视图和部分强类型添加到视图模型中:

@model CommunityViewModel
@using (Html.BeginForm("Index","CommunityController"))
{
    <div>
        @Html.LabelFor(x => x.Id)
        @Html.DropDownListFor(x => x.Id, Model.Communities)
    </div>
}
相关问题