jhessie Ответов: 1

Как сохранить выпадающий список ID od в базе данных


Привет всем, я просто новичок, и у меня есть проблема с моим выпадающим списком:(MVC, ASP.NET)

Сценарий:
> В поле вид при выборе выпадающего списка отображается значение (название категории)
> в контроллере вместо (имя категории) он будет распознавать только присвоенный идентификатор определенному значению

Проблема:
> Когда он нажимает кнопку Сохранить, возвращаемое значение из выпадающего списка равно NULL
> Затем в таблице категорий он создает еще одну строку с пустым содержимым
Модель: (Поставщик)
public class Supplier
   {
       public int Id { get; set; }
       public string SupplierCode { get; set; }
       public string SupplierName { get; set; }
       public int SupplierContact { get; set; }
       public Category Category { get; set; }
   }


Модель: (Категория)
public class Category
    {
        public int Id { get; set; }
        public string CatName { get; set; }
    }


Контроллер (Поставщик)
public ActionResult New()
      {
          var CategoryMenu = _SBC.Categorys.ToList();
          var NewContent = new SupplierandCategoryViewModel()
          {
             CategoryModel = CategoryMenu,
          };
          return View(NewContent);
      }

public ActionResult Save(SupplierandCategoryViewModel Supply)
        {   
               
            var DSupply = new Supplier()
            {
                SupplierName = Supply.SupplierModel.SupplierName,
                SupplierCode = Supply.SupplierModel.SupplierCode,
                SupplierContact = Supply.SupplierModel.SupplierContact,
                Category = Supply.CategoryModel //this part is error; it cannot 
                recognize
            };

            _SBC.Suppliers.Add(DSupply);
            _SBC.SaveChanges();
            return View();
        }


Вид: (Поставщик)
@model ShoeInformation.ViewModel.SupplierandCategoryViewModel
@{
    ViewBag.Title = "New";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<br />
<br />
<h2>Create New Customer</h2>
<br />
<br />
@using (Html.BeginForm("Save", "Supplier"))
{
    <div class="form-group">
        @Html.LabelFor(x=>x.CategoryModel)
        @Html.DropDownListFor(x => x.CategoryModel, new SelectList(Model.CategoryModel,"Id","CatName"), "Select Supplier Category", new {id="myCat",@class="form-control" })
    </div>
    
     <div class="form-group">
        @Html.LabelFor(x=>x.SupplierModel.SupplierCode)
        @Html.TextBoxFor(x => x.SupplierModel.SupplierCode, new { @class="form-control"})
    </div>
    <div class="form-group">
        @Html.LabelFor(x=>x.SupplierModel.SupplierName)
        @Html.TextBoxFor(x => x.SupplierModel.SupplierName, new { @class="form-control"})
    </div>
    <div class="form-group">
        @Html.LabelFor(x=>x.SupplierModel.SupplierContact)
        @Html.TextBoxFor(x => x.SupplierModel.SupplierContact, new { @class="form-control"})
    </div>
    
}


модель представления: (
SupplierandCategoryViewModel
)
public class SupplierandCategoryViewModel
    {
        public IEnumerable<Category> CategoryModel { get; set; }
        public Supplier SupplierModel { get; set; }
    }


Я хочу сохранить идентификатор категории, но в представлении(индексе) он должен отображать значение ID, а не сам идентификатор

Спасибо за ваш ответ!!

Что я уже пробовал:

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

F-ES Sitecore

Только значение выпадающего списка передается вместе с формой, именно так работает html. Если вам нужен связанный текст, то вам нужно будет найти его в своей базе данных, поэтому выполните поиск или выберите в таблице _SBC.Categorys, чтобы получить соответствующую запись для этого идентификатора и прочитать значение из результата.

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

1 Ответов

Рейтинг:
1

Richard Deeming

Ты, кажется, совсем запутался.

SupplierandCategoryViewModel

  • CategoryModel это список категорий;
  • SupplierModel.Category является ли выбранная категория;

Смотреть:
@Html.DropDownListFor(x => x.CategoryModel, ...

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

Контроллер:
public ActionResult Save(SupplierandCategoryViewModel Supply)
{
    ...
    Category = Supply.CategoryModel

Вы пытаетесь сохранить список категорий в свойстве, которое может хранить только единая категория.


Начните с упрощения модели представления:
public class SupplierandCategoryViewModel
{
    // The properties which will be edited:
    public int Id { get; set; }
    public string SupplierCode { get; set; }
    public string SupplierName { get; set; }
    public int SupplierContact { get; set; }
    public int CategoryId { get; set; }
    
    // The data for any drop-down lists:
    public IEnumerable<Category> AllCategories { get; set; }
}
Затем обновите свои действия:
public ActionResult New()
{
    var viewModel = new SupplierandCategoryViewModel
    {
        AllCategories = _SBC.Categorys.ToList(),
    };
    
    return View(viewModel);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(SupplierandCategoryViewModel viewModel)
{
    Supplier supplier;
    if (viewModel.Id == 0)
    {
        supplier = new Supplier();
        _SBC.Suppliers.Add(supplier);
    }
    else
    {
        supplier = _SBC.Suppliers.Single(s => s.Id == viewModel.Id);
    }
    
    supplier.SupplierName = viewModel.SupplierName;
    supplier.SupplierCode = viewModel.SupplierCode;
    supplier.SupplierContact = viewModel.SupplierContact;
    supplier.Category = _SBC.Categorys.Single(c => c.Id == viewModel.CategoryId);
    
    _SBC.SaveChanges();
    return View();
}
Тогда ваша форма становится:
...
@using (Html.BeginForm("Save", "Supplier"))
{
    @Html.AntiForgeryToken()
    
    <div class="form-group">
        @Html.LabelFor(x => x.CategoryId)
        @Html.DropDownListFor(x => x.CategoryId, new SelectList(Model.AllCategories, "Id", "CatName"), "Select Supplier Category", new { id="myCat", @class="form-control" })
    </div>
    
     <div class="form-group">
        @Html.LabelFor(x => x.SupplierCode)
        @Html.TextBoxFor(x => x.SupplierCode, new { @class="form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.SupplierName)
        @Html.TextBoxFor(x => x.SupplierName, new { @class="form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(x => x.SupplierContact)
        @Html.TextBoxFor(x => x.SupplierContact, new { @class="form-control" })
    </div>
    
    <p><button type="submit" class="btn btn-primary">Save</button></p>
}

Вероятно, вы захотите добавить некоторые атрибуты проверки в свою модель представления:
Проверка с помощью валидаторов аннотаций данных (C#) | Microsoft Docs[^]