ASP.NET MVC:LINQ To SQLを使用して多対多のDB連想表にフォームチェックボックスを取得する最良の方法は?

StackOverflow https://stackoverflow.com/questions/223363

質問

ユーザー定義カテゴリのチェックボックスを含む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のコンテキストでこれを自動的に行うよりクリーンな方法があるかどうか疑問に思っていますか?

ありがとう!

役に立ちましたか?

解決

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top