Question

Je développe un MVC 3 Web App Razor, dans lequel les détails de plusieurs catégories d'objets sont stockés. (Véhicules, maisons, instruments, etc.). Tous les objets partagent des données communes (titre, description, etc.) et certains détails qui sont spécifiques à la catégorie dans laquelle il appartient. La liste des catégories devrait croître et en vue de réduire la maintenabilité nous espérons réutiliser le même assistant Ajouter un objet. L'assistant est basé sur la mise en œuvre suivante.

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

Dans le processus de l'assistant de plusieurs étapes, l'étape finale permet à l'utilisateur d'entrer dans les détails spécifiques de la catégorie (modèle, marque, VIN etc pour un véhicule). Actuellement, j'ai imaginé cette dernière étape en vue partielle avec AJAX. Nous allons donc effectivement avoir une vue partielle mulltiple qui reflètent la catégorie spécifique, mais partager le reste du code assistant.

Mon objet modèle générique est comme ceci

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; }
}

Les propriétés complexes AssetDetails est représenté par chaque type de vue partielle. Ainsi, les PartialView « MotorDetails » contiendra un modèle fortement typé de type MotorAsset qui est déclaré comme ci-dessous.

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

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

La validation réelle est bien complexe, mais je l'ai omis ce qui est donc plus facile à comprendre.

La page Assistant principal est déclarée comme

    @model AssetView

  .....

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

La Vue partielle du moteur comme

 @model MotorAsset

Ma question est de savoir comment puis-je réaliser la validation du modèle dans ce scénario (ou est-il possible d'utiliser), l'étape finale est pas dans la page de vue, mais sur une vue partielle.

Était-ce utile?

La solution

Pourquoi ne pas recourir à l'héritage simple des classes (paradigme OOP) plutôt que d'avoir un AssetDetails de propriété sur votre AssetView?

Au lieu de ce que vous avez maintenant, vous devriez plutôt de déclarer

AssetView (propriétés génériques) -> MotorView héritant AssetView (propriétés spécifiques)

Comme ceci:

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

Si vous voulez laisser la façon dont vous avez maintenant, puis utilisez EditorFor() et créer un modèle de EditorFor dans le dossier partagé et type fort à MotorAsset (ou SpecificAsset, si vous voulez encore plus générique).

Ensuite, il rend comme ceci:

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

Cela permettra au contrôleur de valider et AutoBind à la propriété dans votre AssetView. HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top