ASP.NET MVC: лучший способ получить флажки формы в таблицу сопоставления базы данных «многие ко многим» с помощью LINQ To SQL? - PullRequest
12 голосов
/ 22 октября 2008

У меня есть представление 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);
}

Флажки формы будут преобразованы в массив целочисленных идентификаторов «CategoryID», каждый из которых представляет выбранную категорию. Затем я хочу поместить их в таблицу ассоциаций, содержащую два столбца: PostID и CategoryID. Это используется для установки связи «многие ко многим» между сообщениями и категориями.

В настоящее время я перебираю это: перебираю категории и для каждого добавляю в таблицу ассоциаций строку, содержащую идентификатор категории и идентификатор сообщения, которому она принадлежит.

Но мне интересно, есть ли более понятный способ сделать это автоматически в контексте ASP.NET MVC и LINQ to SQL?

Спасибо!

1 Ответ

7 голосов
/ 24 октября 2008

Я думаю, что вы делаете хорошо ... единственное, что я хотел бы сказать, это то, что если вы не хотите перебирать идентификаторы, вы можете добавить их одновременно с помощью "InsertAllOnSubmit" (даже если это действительно просто цикл):

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

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

Но в любом случае, это все еще делает то же самое, что у вас есть.

...