10

私はたくさん検索し、別の手法(stackoverflowなど)を検索して試すためだけに3日間を費やしましたが、asp.net mvcでcheckboxlistを実装するための解決策が見つかりません. そして最後に、問題をstackoverflowに投稿しています。
したがって、私のモデルは次のようになります。

私のモデルの多対多の関係 (1 つのカテゴリに多くのプロジェクトが含まれ、プロジェクトが多くのカテゴリに属している可能性があります) rel

モデルの多対多の関係 (1 つのカテゴリに複数のプロジェクトが含まれ、1 つのプロジェクトが複数のカテゴリに属している可能性があります)

 [HttpGet]
    [Authorize(Roles = "Admin")]
    public ActionResult ProjectAdd()
    {
        return View();
    }

私の見解;

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Add New Project</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProjectHeading)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProjectHeading)
            @Html.ValidationMessageFor(model => model.ProjectHeading)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProjecctUrl)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProjecctUrl)
            @Html.ValidationMessageFor(model => model.ProjecctUrl)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProjectLongDescription)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProjectLongDescription)
            @Html.ValidationMessageFor(model => model.ProjectLongDescription)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.PromoFront)
        </div>
        @Html.EditorFor(model => model.PromoFront)
        @Html.ValidationMessageFor(model => model.PromoFront)

        <div class="editor-label">
            @Html.LabelFor(model => model.ProjectThubmnail)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProjectThubmnail)
            @Html.ValidationMessageFor(model => model.ProjectThubmnail)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProjectImage)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProjectImage)
            @Html.ValidationMessageFor(model => model.ProjectImage)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CategoryId)
            @Html.ValidationMessageFor(model => model.CategoryId)
        </div>

        <p>
            <input type="submit" value="Create" class="submit" />
        </p>

だから、私の質問は、ビューにカテゴリのチェックボックスリストを表示するにはどうすればよいですか?
そのチェックボックスリストから選択した値を取得するにはどうすればよいですか?

4

2 に答える 2

17

すべてのカテゴリのリストを持つオブジェクトが必要です。たとえば、次のようにすることができます。

[HttpGet]
[Authorize(Roles = "Admin")]
public ActionResult ProjectAdd()
{
    // Get all categories and pass it into the View
    ViewBag.Categories = db.ListAllCategories();

    return View();
}

ビューの上部に

@model Database.Project
@{
   // retrieve the list of Categories
   List<Database.Category> categories = ViewBag.Categories;
}

そして、これを交換します

    <div class="editor-label">
        @Html.LabelFor(model => model.CategoryId)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.CategoryId)
        @Html.ValidationMessageFor(model => model.CategoryId)
    </div>

このため

    <div class="editor-label">
        <label for="categories">Categories</label>
    </div>
    <div class="editor-field">
        @foreach(var c in categories) {

        <label class="checkbox">
            <input type="checkbox" name="categories" value="@c.CategoryId"> @c.CategoryName
        </label>

        }
    </div>

コントローラーに戻ります

[HttpPost]
[Authorize(Roles = "Admin")]
public ActionResult ProjectAdd(Database.Project model, int[] categories)
{
    if(ModelState.IsValid) {

        // fill up categories
        db.InsertAndSaveProject(model, categories);

    }

    ...

    return redirectToView("ProjectAdd");
}
于 2012-09-29T06:30:31.823 に答える
4

上記の@balexandreが提案した回答はうまく機能します。ただし、CheckBoxList には次の HTML 拡張を使用しました。

1. ASP.net MVC4 の CheckboxList
2. ソース コード:HTML 拡張ヘルパー メソッド (Github)

このヘルパー メソッドを使用する主な利点は、コードがクリーンで読みやすいことです。例えば

@Html.CheckBoxListFor(model => model.SelectedItems, Model.AllItems)
于 2014-01-27T01:02:40.697 に答える