0

したがって、私のコントローラーのコードは次のとおりです。

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>

部分ビューで、DropDownListを作成しようとしています(まだ学習中です。これは、asp.netチュートリアルの概念を理解したかどうかを確認するための練習用アプリです)。次に、このリストを取得します。エンティティの、1つのフィールドを表示し、他から値を取得します("名前"と"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を介して送信されています。

アイデアをお願いします?

4

1 に答える 1

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 を使用することにしたので、パーシャル内のこの 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>
}
于 2012-10-19T07:09:42.413 に答える