0

Я хочу знать, как я могу получить значения нескольких флажков. У меня есть диаграмма и некоторый код, пожалуйста, взгляните на это. Там несколько шагов, которые мне нужно сделать:Получение нескольких значений флажков и их размещение в ICollection MVC

  1. Положите все категории из таблицы категорий в продукте/Создать файл как Флажки (который поместит ввод в таблице Product)
  2. Извлечь выбранный Флажки
  3. для каждого выбранного флажка, добавить продукт в его собственный список в таблице категорий

Позже я должен отображать каждую категорию с соответствующими продуктами.

Надеюсь, это имеет смысл. Вот мой код. Я не хочу создавать другой файл/модель/представление/контроллер, если это возможно. Я перевел все на английский, чтобы читать было легче.

Категория Модель:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebshopMVC.Models 
{ 
    public class Category 
    { 
     public int ID { get; set; } 
     public string Image { get; set; } 
     public string Name { get; set; } 
     public string Description{ get; set; } 

     public virtual ICollection<Product> Producten { get; set; } 
    } 
} 

Модель продукта:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebshopMVC.Models 
{ 
    public class Product 
    { 
     public int ID { get; set; } 
     public string Image { get; set; } 
     public string Name{ get; set; } 
     public string Description{ get; set; } 
     public decimal Price{ get; set; } 

     public virtual ICollection<Category> Categories{ get; set; } 

     public virtual ICollection<Offer> Offers{ get; set; } 

    } 
} 

Продукт/Create View:

@model WebshopMVC.Models.Categorie 

    @{ 
     ViewBag.Title = "Create"; 
    } 

    <h2>Create</h2> 


    @using (Html.BeginForm()) 
    { 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Categorie</h4> 
     <hr /> 
     @Html.ValidationSummary(true) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Image) 
       @Html.ValidationMessageFor(model => model.Image) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name) 
       @Html.ValidationMessageFor(model => model.Name) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Description) 
       @Html.ValidationMessageFor(model => model.Description) 
      </div> 
     </div> 



     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
    } 

    <div> 
     @Html.ActionLink("Back to List", "Index") 
    </div> 

Controller Product (Создать)

public ActionResult Create() 
     { 
      return View(); 
     } 

     // POST: /Product/Create 
     // To protect from overposting attacks, please enable the specific  properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include =   "ID,Image,Name,Description,Price,Categories")] Product product) 
      { 
      if (ModelState.IsValid) 
      { 
       db.Producten.Add(product); 

       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(product); 
     }  

А вот схема того, как это должно быть:

Diagram

Это просто изображение, и это на голландском языке, так что я дам вам перевод на английский язык:

Categorie => Category 
plaatje => Image 
naam => Name 
omschrijving => Description 

Product => Product 
plaatje => Image 
naam => Name 
omschrijving => Description 
Prijs => Price 

Так, опять же:

  1. L и др пользователь создать продукт и назначить 1 или несколько категорий, которые будут выходить из ТАБЛИЦЫ

  2. Получить выбранные категории, добавлять их в список категорий в модели продукта

  3. Добавить продукт в список продуктов в модели категории

  4. Позже я должен быть в состоянии проходных категорий и получить свою продукцию, так что я могу связаться с ними сильного текстом

Шаги 2 и 3 могут показаться немного странными, но в соответствии с моделью категория имеет * продукты и продукт имеет 1 или более категорий, поэтому я также закодировал его таким образом

Я боролся с этим для многих часов. Если бы кто-нибудь мог мне помочь, я был бы так благодарен!

Если вам нужна какая-либо другая информация, я с радостью отдам ее вам!

Редактировать:
Я добавил модем для моего проекта.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebshopMVC.Models 
{ 

    public class ProductCategoryViewModel 
    { 
     public string Image{ get; set; } 
     public string Name { get; set; } 
     public string Description{ get; set; } 
     public decimal Price { get; set; } 

     public IEnumerable<Categorie> Categories { get; set; } 

     public ProductCategoryViewModel() 
     { 
      Categories = Categories.ToList(); 
     } 
    } 
} 

Я также изменил Продукт/Create.cshtml файл:

<div class="form-group"> 
      @Html.LabelFor(model => Model.Categories) 
      <div class="col-md-10"> 
       @foreach (var item in Model.Categories) 
       { 
        <input type="checked" name="Categories" value="@(item.Name)">@(item.Name) 
       } 
      </div> 
     </div> 

теперь я получаю сообщение об ошибке при попытке перейти к продукту/Создать страницу: ссылки

объектов не установлен в экземпляр объекта. (Линия 54)

Line 52:    @Html.LabelFor(model => Model.categories) 
Line 53:    <div class="col-md-10"> 
Line 54:     @foreach (var item in Model.categories) 
Line 55:     { 
Line 56:      <input type="checked" name="Categories" value="@(item.Name)">@(item.Name) 

Я не знаю, как исправить эту ошибку, и я также не понимаю, как это работает. Как этот ProductCategoryViewModel извлекает информацию из таблицы базы данных/категории. Я не вижу ссылки нигде.

Я добавлю диаграмму классов, может быть, что помогает:

Database Diagram

ответ

0

Создать ViewModel и поставить IEnumerable<Categories> в нем. Затем вы можете использовать цикл for для привязки флажков с отдельными элементами.

public class ProductCategoryViewModel 
{ 
    public string Image{get;set;} 
    public string Name{get;set;} 
    public string Description{get;set;} 
    public double Price{get;set;} 

    public IEnumerable<Category> Categories{get;set;} 

    public() 
    { 
     Categories = Categories.GetAll().ToList(); 
    } 
} 

@foreach (var item in Model.Categories) { 
    <input type="checked" name="Categories" value="@(item.Name)">@(item.Name) 
    //or use html helper which will add hidden input as well 
    // @Html.CheckboxFor(x=> x.Name); 
} 

EDIT: - Вы должны объявить модель для использования в целях в верхней части cshtml файла:

@model IEnumerable<ProductCategoryViewModel> 

Затем вам нужно установить это от действия контроллера:

var vm = new ProductCategoryViewModel(); 
return new View("Create", vm); 

Также это не будет работать:

public ProductCategoryViewModel() 
{ 
    Categories = Categories.ToList(); 
} 

Categories еще не заселен, поэтому это утверждение бесполезно. Вам нужно получить категории где-нибудь (например, базу данных) и установить это свойство. Нравится,

public ProductCategoryViewModel() 
{ 
    Categories = <GET FROM DATABASE>; 
} 
+0

Я не понимаю. Нужно ли мне создавать другой класс? Должен ли я поместить это в папку Моды? @foreach находится в моем представлении «Продукт/Создать», правильно? Тогда как мне получить доступ к ProductCategoryViewModel, когда я уже использую модель продукта? Я также не знаю, как получить значения этих флажков. Не могли бы вы мне помочь? –

+0

Я добавил дополнительную информацию к своему сообщению @TheVillageIdiot. Не могли бы вы взглянуть на него? –

Смежные вопросы