Я хочу знать, как я могу получить значения нескольких флажков. У меня есть диаграмма и некоторый код, пожалуйста, взгляните на это. Там несколько шагов, которые мне нужно сделать:Получение нескольких значений флажков и их размещение в ICollection MVC
- Положите все категории из таблицы категорий в продукте/Создать файл как Флажки (который поместит ввод в таблице Product)
- Извлечь выбранный Флажки
- для каждого выбранного флажка, добавить продукт в его собственный список в таблице категорий
Позже я должен отображать каждую категорию с соответствующими продуктами.
Надеюсь, это имеет смысл. Вот мой код. Я не хочу создавать другой файл/модель/представление/контроллер, если это возможно. Я перевел все на английский, чтобы читать было легче.
Категория Модель:
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);
}
А вот схема того, как это должно быть:
Это просто изображение, и это на голландском языке, так что я дам вам перевод на английский язык:
Categorie => Category
plaatje => Image
naam => Name
omschrijving => Description
Product => Product
plaatje => Image
naam => Name
omschrijving => Description
Prijs => Price
Так, опять же:
L и др пользователь создать продукт и назначить 1 или несколько категорий, которые будут выходить из ТАБЛИЦЫ
Получить выбранные категории, добавлять их в список категорий в модели продукта
Добавить продукт в список продуктов в модели категории
Позже я должен быть в состоянии проходных категорий и получить свою продукцию, так что я могу связаться с ними сильного текстом
Шаги 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 извлекает информацию из таблицы базы данных/категории. Я не вижу ссылки нигде.
Я добавлю диаграмму классов, может быть, что помогает:
Я не понимаю. Нужно ли мне создавать другой класс? Должен ли я поместить это в папку Моды? @foreach находится в моем представлении «Продукт/Создать», правильно? Тогда как мне получить доступ к ProductCategoryViewModel, когда я уже использую модель продукта? Я также не знаю, как получить значения этих флажков. Не могли бы вы мне помочь? –
Я добавил дополнительную информацию к своему сообщению @TheVillageIdiot. Не могли бы вы взглянуть на него? –