5

私はこれらのエンティティを持っています(それらの間には多対多の接続があります):

public class Post
{     
    public Guid PostId { get; set; }     
    public string Name { get; set; }       
    public virtual ICollection<Tag> Tags { get; set; }
}

  public class Tag
{
    public int TagId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

ユーザーがPostを作成するときに、MultiSelectListとMultiSelectListからデータを選択して、そのデータをPost.Tagsに渡すようにしたいと思います。どうやってやるの ?

4

1 に答える 1

13

私は似たようなものを持っています。製品は多くのカテゴリに属し、カテゴリには多くの製品があります。

新しい製品を作成するための管理ビューでは、ユーザーがこの製品をリストする必要があるカテゴリの複数の「タグ」を選択できるようにすることができます。

カテゴリが非常に多いため、複数選択リストを避け、ajaxで一種の自動提案を使用してカテゴリを取得し、TagItなどのjQueryプラグインを使用してそれらにデータを入力する傾向があります。

ただし、簡単にするために、これをコントローラーで使用できます

public class HomeController : Controller
{
    public ActionResult Create()
    {
        var tags = new List<Tag>()
            {
                new Tag() { TagId = 1, Name = "Planes", Posts = new Collection<Post>() },
                new Tag() { TagId = 2, Name = "Cars", Posts = new Collection<Post>() },
                new Tag() { TagId = 2, Name = "Boats", Posts = new Collection<Post>() }
            };

        ViewBag.MultiSelectTags = new MultiSelectList(tags, "TagId", "Name");

        return View();
    }

    [HttpPost]
    public ActionResult Create(Post post, int[] tags) // Tags is not case-sensative from model binder when html element name="tags" <-- array passed back to controller
    {

        // Find Tag from Database
        // Attach tag entity to Post

        // foreach(var tagId in tags)
        //    var tag = context.Tags.find(tagId)
        //    post.Tags.Add(tag);

        // context.SaveChanges();

        return RedirectToAction("Create");
    }

}

そしてあなたのView/Create.cshtmlの中に

@model MvcApplication1.Models.Post

<h2>Create</h2>


@using (Html.BeginForm("Create", "Home", FormMethod.Post))
{
    <label>Name</label>
    @Html.TextBoxFor(model => model.Name)

    <label>Tags For Post</label>
    @Html.ListBox("Tags", (MultiSelectList)ViewBag.MultiSelectTags)

    <input type="submit" value="Submit Post"/>
}

選択したすべてのタグ:

次に、コントローラーにポストバックするときに複数が選択されると、モデルバインダーがhtml要素名「tags」から配列を送り返すことを知っていることがデバッグでわかります。

于 2013-03-17T15:25:30.870 に答える