2012-09-29 24 views
10

He buscado mucho y gasto 3 días solo para buscar y probar diferentes técnicas (en stackoverflow, etc.) pero no encuentro ninguna solución para implementar checkboxlist en asp.net mvc. Y finalmente estoy publicando mi problema en stackoverflow;
Por lo tanto, mi modelo se ve así;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

de muchos a muchos de mi modelo (1 categoría puede contener muchos proyectos y un proyecto puede pertenece a muchas categorías)
Mi controlador;

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

Mi punto de 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> 

lo tanto, mi pregunta es ¿Cómo puedo mostrar CheckBoxList por categorías en mi punto de vista?
¿Cómo obtengo los valores seleccionados de esa casilla de verificación?

Respuesta

17

Es necesario tener un objeto que va a tener una lista de todas las categorías, por ejemplo, usted podría hacer esto:

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

    return View(); 
} 

en la parte superior de la vista

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

y luego reemplace esto

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

para este

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

de vuelta en su controlador

[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

u puede decirme una cosa más, que es cómo hacer yo bucle a través de cada categoría –

+0

@DotNetDreamer con un 'foreach (int gato en categorías) db.InsertCategory (model.ProductId, gato);' y se necesita una tabla para contener ambos valores, una tabla 'ProductCategories' que solo contiene' ProductId' y 'CategoryId'. Recuerde que para EDITAR, necesita eliminar todas las categorías para ese producto en la nueva tabla 'ProductCategories' y agregarlas nuevamente. – balexandre

+0

sí, ya he hecho I-e ProjectCategories pero necesito insertar esto en la tercera tabla? –

Cuestiones relacionadas