ASP.NET MVC Динамические представления - PullRequest
0 голосов
/ 01 февраля 2011

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

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

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>

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

_thisAsset.AssetDetails = new MotorAsset();

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

Мастер работает нормально, но на этапе сохранения в контроллере свойство «AssetDetails» не имеет значений и показано, что оно имеет тип «SpecificAsset», который является базовым типом. я не могу привести его к определенному типу. Тем не менее, FormsCollection показывает все значения, определенные свойства «AssetDetails», такие как «Transmission», «Make», находятся в коллекции форм с префиксом «AssetDetails_».

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

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

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

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

0 голосов
/ 01 февраля 2011

Если вы знаете тип AssetDetails, вы можете сделать это следующим образом:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...