2017-02-06 2 views
1

Я получил ProductModel с недвижимостью public ProductCategoryModel Category { get; set; }. ProductCategoryModel - это, очевидно, набор категорий, которые будут добавляться или удаляться динамически. Поэтому во время создания/редактирования ProductModel мне нужен раскрывающийся список с 1-значным именем с существующими категориями. Могу ли я использовать @Html.EditorFor(...) для этой цели?Как отредактировать массив proreprty через встроенный @ Html.EditorFor (..)?

Решения, которые я перехожу на сейчас

@Html.DropDownList(
      "CategoryTitle", 
      SelectListGenerator.GenerateFrom(categoires, i => i.Title, i => i.Title), 
      new { htmlAttributes = new { 
       @class = "form-control", 
       @data_val = "true", 
       @data_val_required = "Не выбрана категория!", 
       @id = "CategoryTitle", 
       @name = "CategoryTitle" 
      } }) 

Потому что она возвращает не в ProductCategoryModel объект, а просто строка - имя его, я вынужден сделать дополнительную работу в моем контроллере:

public ActionResult Create(CreateProduct_ViewModel vm) 
    { 
     vm.ProductModel.Category = _productCategoryEntities.ByName(vm.CategoryTitle); 
     ValidateModel(vm); 
     if (ModelState.IsValid) 
     {    
      _productEntities.Products.Add(vm.ProductModel); 
      _productEntities.SaveChanges(); 

      return RedirectToAction(nameof(Index)); 
     } 

     return View(vm); 
    } 

Этот код выглядит довольно грязным и деффициентом.

Итак, еще раз, во время создания нового ProductModel Мне нужен раскрывающийся список, в котором можно выбрать существующую категорию, а не форму для создания новой (это по умолчанию для @Html.EditorFor(...)). И я хочу получить объект ProductModel в свой метод Create(...), поэтому он выглядит как Create(ProductModel model) в пределах назначенного Category собственности, таким образом избегая этого vm.ProductModel.Category = _productCategoryEntities.ByName(vm.CategoryTitle);.

+0

Почему бы не использовать раскрывающееся меню категории? Вы можете сделать «множественный» выбор, если необходимо – Shyju

+0

@Shyju Потому что он не связывает свойство категории должным образом. Он всегда равен нулю. Более того, если я отмечаю его как [Обязательный], он выдает исключение. –

ответ

0

EditorFor - это шаблонный помощник. Он выбирает, какой шаблон использовать на основе типа свойства, аннотация DataType и т. Д. Поскольку CategoryTitle - это просто строка, вы получаете стандартное текстовое поле.

DropDownListFor здесь более уместно, так как вам нужно это управление явно. Если опубликованное значение всегда равно null, это означает, что вы не привязываете его должным образом. Он должен быть привязан к свойству модели вашего взгляда, а значение, которое вы публикуете, должно быть того же типа (или принудительного для этого типа). Например, опубликованное значение элемента select всегда будет строкой, но если это что-то вроде «1», модельный блок достаточно интеллектуальный, чтобы привязать его к свойству int. Однако, если опубликованное значение было чем-то вроде «true», и вы пытались связать это с int, оно не будет связываться, потому что «true» не является принудительным для int. Это надуманный пример, но это просто иллюстрирует суть.

Необходимость поиска категории по размещенному значению неизбежна. Опять же, опубликованное значение будет строкой. Невозможно опубликовать весь объект категории из элемента select. Поэтому лучше всего использовать опубликованное значение для поиска объекта категории, а затем связать его с свойством category.

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