ASP.NET Модель MVC, разделенная на несколько частичных представлений

StackOverflow https://stackoverflow.com/questions/4837901

Вопрос

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

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

В многоступенчатом процессе работы мастера последний шаг позволяет пользователю ввести данные, относящиеся к конкретной категории (модель, марка, VIN и т.д. Для транспортного средства).В настоящее время я представлял себе этот заключительный шаг как частичное представление с помощью AJAX.Таким образом, на самом деле у нас будет несколько частичных представлений, которые отражают конкретную категорию, но совместно используют остальной код мастера.

Мой универсальный объект модели выглядит следующим образом

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

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

    // Few more generic fields here

    public SpecificAsset AssetDetails { get; set; }
}

Комплексное свойство AssetDetails представлено каждым типом частичного представления.Таким образом, PartialView "MotorDetails" будет содержать строго типизированную модель типа MotorAsset, которая объявлена как показано ниже.

  public class MotorAsset : SpecificAsset
    {
        [Required]
        public string Transmission
        {
            get;
            set;
        }

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

Фактическая проверка намного сложнее, но я опустил их, чтобы было легче понять.

Главная страница Мастера объявляется как

    @model AssetView

  .....

  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
      @{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
  </div>

Частичный вид двигателя как

 @model MotorAsset

Мой вопрос заключается в том, как я могу выполнить проверку модели в этом сценарии (или это возможно использовать), поскольку последний шаг находится не на странице просмотра, а в частичном представлении.

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

Решение

Почему бы вам не прибегнуть к простому наследованию классов (парадигма ООП) вместо того, чтобы иметь свойство AssetDetails в вашем AssetView?

Вместо того, что у вас сейчас есть, вам следует скорее объявить

AssetView (общие свойства) -> MotorView, наследующий AssetView (специфические свойства)

Вот так:

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

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

    // Few more generic fields here
}

public class MotorView : AssetView {
    ...
}

@model MotorView    // you still have access to the AssetView's properties in your view and in your controller actions

Если вы хотите оставить все так, как у вас есть сейчас, то используйте EditorFor() и создать EditorFor шаблон в общей папке и строго введите его в MotorAsset (или SpecificAsset, если вы хотите, чтобы это было еще более обобщенно).

Затем визуализируйте это следующим образом:

@Html.EditorFor(model=>model.AssetDetails)

Это позволит контроллеру проверить его и автоматически привязать к свойству в вашем AssetView.HTH

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