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?
-
03-07-2019 - |
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" /> <%= c.Name%><% }
else { %>
<input name="CategoryIDs" type="checkbox" value="<%=c.ID %>" /> <%= 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!
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.