ASP.NET MVC: Il modo migliore per ottenere le caselle di controllo del modulo nella tabella assoc DB molti-a-molti con LINQ To SQL?

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

Domanda

Ho una vista MVC ASP.NET che contiene caselle di controllo per le categorie definite dall'utente.

<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>

Il modulo viene inviato alla seguente azione del controller:

[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);
}

Le caselle di controllo del modulo verranno convertite in una matrice di ID interi "IDCategoria", ciascuno dei quali rappresenta una categoria selezionata. Voglio quindi metterli in una tabella di associazione contenente due colonne: PostID e CategoryID. Viene utilizzato per creare un'associazione molti-a-molti tra post e categorie.

Attualmente lo sto forzando brutalmente: eseguendo il ciclo tra le categorie e, per ognuna, aggiungo una riga alla tabella dell'associazione contenente l'ID categoria e l'ID del post a cui appartiene.

Ma mi chiedo se esiste un modo più pulito per farlo automagicamente nel contesto di ASP.NET MVC e LINQ to SQL?

Grazie!

È stato utile?

Soluzione

Penso che quello che stai facendo vada bene ... l'unica cosa che direi è che se non vuoi scorrere gli ID, puoi aggiungerli contemporaneamente con " InsertAllOnSubmit " (anche se questo è davvero solo un loop):

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

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

Ma in entrambi i casi, è sempre lo stesso di quello che hai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top