12

ユーザー定義のカテゴリのチェックボックスを含む ASP.NET MVC ビューがあります。

<td><% foreach (Category c in (List<Category>)ViewData["cats"]) {
       if (selCats.ContainsKey(c.ID)) { %>
       <input name="CategoryIDs" type="checkbox" value="<%=c.ID %>" checked="checked" />&nbsp;<%= c.Name%><% } 
        else { %>
       <input name="CategoryIDs" type="checkbox" value="<%=c.ID %>" />&nbsp;<%= c.Name%> <% } %>
     <% } %>
</td>

フォームは、次のコントローラー アクションにポストされます。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, int [] CategoryIDs)
{
    PostsDataContext db = new PostsDataContext();
    var post = db.Posts.Single(p => p.ID == id);
    UpdateModel(post, new[] { "Title", "Subtitle", "RawContent", "PublishDate", "Slug" });
    db.SubmitChanges();
    return Redirect("/archives/" + post.Slug);
}

フォームのチェックボックスは、それぞれが選択されたカテゴリを表す整数 ID「CategoryIDs」の配列に変換されます。次に、これらを PostID と CategoryID の 2 つの列を含む関連付けテーブルに配置します。これは、投稿とカテゴリの間の多対多の関連付けを設定するために使用されます。

現在、私は総当たり攻撃を行っています: カテゴリをループし、カテゴリごとに、カテゴリ ID とそれが属する投稿の ID を含む関連付けテーブルに行を追加します。

しかし、ASP.NET MVC と LINQ to SQL のコンテキストでこれを自動的に行うためのよりクリーンな方法があるかどうか疑問に思っています。

ありがとう!

4

1 に答える 1

7

あなたがしていることは問題ないと思います...私が言う唯一のことは、IDをループしたくない場合は、「InsertAllOnSubmit」で同時に追加できるということです(これは実際にはループするだけです):

int[] categoryIDs = new int[] { 0, 1, 2 };

dataContext.PostCategories.InsertAllOnSubmit(
categoryIDs.Select(id =>
    new PostCategory
    {
        CategoryID = id,
        PostID = myPostID
    })
);

しかし、どちらにしても、それはあなたが持っているものと同じことをしているだけです.

于 2008-10-24T03:04:14.237 に答える