5

与えられたクラス

public class Person
{
    // Some general properties

    public List<Hobby> Hobbies { get; set; }
}

public class Hobby
{
    // Some properties e.g. Name, etc.
}

static List<Hobby> AllHobbies { get; }

モデル バインディングを使用して、ユーザーが自分の趣味を選択できるビューを作成することは可能ですか?

AllHobbiesビューで for each をループしてレンダリング<input type="checkbox" />し、選択した値をポストバック コントローラーで手動で接続することは確かに可能です。これはモデルバインディングで実行できるはずですが、方法がわかりません。

4

1 に答える 1

11

もちろん、エディター テンプレートを使用することをお勧めします。

趣味に名前と、それがユーザーによって選択されたかどうかを示すブール値フィールドがあるとします。

public class Hobby
{
    public string Name { get; set; }
    public bool Selected { get; set; }
}

次に、モデルをビューにフィードし、フォームの送信を処理するコントローラー:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var person = new Person
        {
            Hobbies = new[]
            {
                new Hobby { Name = "hobby 1" },
                new Hobby { Name = "hobby 2", Selected = true },
                new Hobby { Name = "hobby 3" },
            }.ToList()
        };
        return View(person);
    }

    [HttpPost]
    public ActionResult Index(Person person)
    {
        var selectedHobbies = person
            .Hobbies
            .Where(x => x.Selected).Select(x => x.Name);
        string message = string.Join(",", selectedHobbies);
        return Content("Thank you for selecting: " + message);
    }
}

次に、ユーザーが趣味を選択できるフォームを含むビュー:

@model Person

@using (Html.BeginForm()) 
{
    <h2>Hobbies</h2>
    @Html.EditorFor(x => x.Hobbies)
    <button type="submit">OK</button>
}

Hobbiesコレクションの各要素に対して自動的にレンダリングされる対応するエディター テンプレート( ~/Views/Home/EditorTemplates/Hobby.cshtml-> テンプレートの名前と場所が重要であることに注意してください):

@model Hobby

<div>
    @Html.LabelFor(x => x.Selected, Model.Name)
    @Html.HiddenFor(x => x.Name)
    @Html.CheckBoxFor(x => x.Selected)
</div>

より高度な編集シナリオについては、このトピックに関するSteven Sanderson のブログ投稿を参照することをお勧めします。

于 2012-06-11T17:32:32.980 に答える