Вопрос

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

Я разрабатываю веб -приложение для бритвы MVC 3, в котором хранятся детали нескольких категорий объектов. (Транспортные средства, дома, инструменты и т. Д.). Все объекты имеют некоторые общие данные (заголовок, описание и т. Д.) и некоторые детали, которые относятся к категории, в которой они принадлежат. Ожидается, что список категорий будет расти, и, учитывая снижение обслуживания, мы надеемся повторно использовать тот же мастер Add Abyt. Волшебник основан на следующей реализации.

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

В процессе множественного шага, последний шаг позволяет пользователю вводить конкретные детали категории (модель, создание, VIN и т. Д. Для транспортного средства). Страница просмотра связана с моделью «AssetView», которая определяется следующим образом

public class AssetView
{
    [Required]      
    public string Title { get; set;  }

    [Required]
    public string Description { get; set;}

    public SpecificAsset AssetDetails { get; set; }
}

Свойство AssetDetails будет динамически изменено во время выполнения в соответствии с типом категории, который выбран на предыдущем этапе. вид выглядит так

@model AssetView
....
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  @Html.EditorFor(model => model.AssetDetails)
 </div>

в контроллере, основанный на выборе категории. Я интриализую AssetDetails следующим образом

_thisAsset.AssetDetails = new MotorAsset();

Затем я переопределяю представления с помощью специфических шаблонов редактора типа.

Волшебник работает нормально, но на шаге сохранения в контроллере свойство «AssetDetails» не имеет значений, и оно показано, что это тип «Completasset», который является базовым типом. Я также не могу поднять его на конкретный тип. Однако FormScollection показывает все значения, конкретные свойства «AssetDates», такие как «передача», «Make», находятся в сборе форм, префиксированных «AssetDetails_».

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

Это было полезно?

Решение

Если вы знаете тип AssetDetails, вы можете сделать это так:

  1. Возьмите AssetView как параметр в действие (связывает общие свойства)
  2. Создайте новый экземпляр конкретных AssetDetails (например, Cardetails)
  3. Используйте одну из перегрузки TREAPDATEMODEL, чтобы связать значения. Есть некоторые перегрузки, которые позволяют вам указать префикс, поэтому он всегда должен работать
  4. Добавьте этот объект в AssetView.pecificasset

Вам нужен способ узнать конкретный тип. Но я думаю, что у вас будет переменная, которая отслеживает тип, чтобы вы могли сохранить его правильно позже. Если вы этого не сделаете, это было бы легко добавить. Помните, что это должно быть AssetView, поскольку AssetDelets не связаны, хотя.

Если вам нужна проверка, есть TryValidateModel, которую вы тоже можете попробовать.

Другие советы

Как я понял, количество моделей будет расти, и вы хотите повторно использовать действия и просмотр для всех моделей. Один из вариантов, который я вижу, - это создать пользовательский модельный Binder. Вы рассмотрите FormCollection и создаете конкретную модель активов.

Проблема с вашим решением заключается в том, что у конкретного ассетка нет свойств, поэтому Binder модели по умолчанию не связывает ни одного из полей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top