2012-09-29 22 views
10

Ho cercato molto e ho trascorso 3 giorni solo per cercare e provare diverse tecniche (su stackoverflow ecc.) Ma non trovo alcuna soluzione per implementare checkboxlist in asp.net mvc. E alla fine sto postando il mio problema allo stackoverflow;
Quindi, il mio modello è simile a questo;Asp.Net MVC4 Display CheckboxList

Many to Many relationship of my model(1 category may contain many project and a project may belongs to many categories) rel

relazione molti a molti del mio modello (1 categoria può contenere molti progetti e un progetto può appartiene a molte categorie)
mio controllore;

[HttpGet] 
    [Authorize(Roles = "Admin")] 
    public ActionResult ProjectAdd() 
    { 
     return View(); 
    } 

mio punto di vista;

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Add New Project</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProjectHeading) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProjectHeading) 
      @Html.ValidationMessageFor(model => model.ProjectHeading) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProjecctUrl) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProjecctUrl) 
      @Html.ValidationMessageFor(model => model.ProjecctUrl) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProjectLongDescription) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProjectLongDescription) 
      @Html.ValidationMessageFor(model => model.ProjectLongDescription) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.PromoFront) 
     </div> 
     @Html.EditorFor(model => model.PromoFront) 
     @Html.ValidationMessageFor(model => model.PromoFront) 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProjectThubmnail) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProjectThubmnail) 
      @Html.ValidationMessageFor(model => model.ProjectThubmnail) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProjectImage) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProjectImage) 
      @Html.ValidationMessageFor(model => model.ProjectImage) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CategoryId) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CategoryId) 
      @Html.ValidationMessageFor(model => model.CategoryId) 
     </div> 

     <p> 
      <input type="submit" value="Create" class="submit" /> 
     </p> 

Quindi, la mia domanda è Come faccio a visualizzare CheckBoxList per le categorie a mio punto di vista?
Come ottengo i valori selezionati da tale checkbox?

risposta

17

È necessario disporre di un oggetto che avrà una lista di tutte le categorie, per esempio, si potrebbe fare questo:

[HttpGet] 
[Authorize(Roles = "Admin")] 
public ActionResult ProjectAdd() 
{ 
    // Get all categories and pass it into the View 
    ViewBag.Categories = db.ListAllCategories(); 

    return View(); 
} 

nella parte superiore del vostro View

@model Database.Project 
@{ 
    // retrieve the list of Categories 
    List<Database.Category> categories = ViewBag.Categories; 
} 

e quindi sostituire questo

<div class="editor-label"> 
     @Html.LabelFor(model => model.CategoryId) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.CategoryId) 
     @Html.ValidationMessageFor(model => model.CategoryId) 
    </div> 

per questo

<div class="editor-label"> 
     <label for="categories">Categories</label> 
    </div> 
    <div class="editor-field"> 
     @foreach(var c in categories) { 

     <label class="checkbox"> 
      <input type="checkbox" name="categories" value="@c.CategoryId"> @c.CategoryName 
     </label> 

     } 
    </div> 

indietro nel Controller

[HttpPost] 
[Authorize(Roles = "Admin")] 
public ActionResult ProjectAdd(Database.Project model, int[] categories) 
{ 
    if(ModelState.IsValid) { 

     // fill up categories 
     db.InsertAndSaveProject(model, categories); 

    } 

    ... 

    return redirectToView("ProjectAdd"); 
} 
+0

può u mi dica una cosa, che è come faccio a collegare attraverso ogni categoria –

+0

@DotNetDreamer con un 'foreach (int gatto in categorie) db.InsertCategory (model.ProductId, gatto),' e te serve una tabella per contenere entrambi i valori, una tabella 'ProductCategories' che contiene solo' ProductId' e 'CategoryId'. Ricorda che per EDITING, devi eliminare tutte le categorie per quel prodotto nella nuova tabella 'ProductCategories' e aggiungerle di nuovo. – balexandre

+0

sì, l'ho già fatto io-e ProjectCategories ma devo inserirlo nella terza tabella? –

4

risposta suggerita da @balexandre sopra grandi opere. Tuttavia, ho usato la seguente estensione HTML per CheckBoxList.

1. CheckboxList in ASP.net MVC4
2. Source Code:HTML Extension Helper method (Github)

Il principale vantaggio di utilizzare questo metodo di supporto è il codice pulito e una migliore leggibilità. Per esempio.

@Html.CheckBoxListFor(model => model.SelectedItems, Model.AllItems) 
+0

Ho eseguito il upvoted di entrambe le domande e le risposte precedenti. – Rohit