Question

Je Publié le contexte de cette question il y a quelques jours .. mais la réponse est encore incomplète, donc Réaffectation un résumé.

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). La page de vue est lié au modèle « AssetView », qui est défini comme suit

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

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

    public SpecificAsset AssetDetails { get; set; }
}

la propriété AssetDetails sera modifiée dynamiquement lors de l'exécution en fonction du type de catégorie qui est sélectionnée à une étape précédente. les regards de vue comme celui-ci

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

dans le contrôleur, en fonction de sélection de catégorie. i intialize assetdetails comme suit

_thisAsset.AssetDetails = new MotorAsset();

Je puis passer outre les vues avec des modèles spécifiques de type Editor.

L'assistant fonctionne très bien, mais à l'étape Enregistrer dans le contrôleur du « AssetDetails » la propriété n'a pas de valeur et il est démontré que de type « SpecificAsset » qui est le type de base. Je suis incapable de le jeter au type spécifique ainsi. Cependant, les FormsCollection affiche toutes les valeurs, les propriétés spécifiques « de AssetDetails » comme « Transmission », « Marque » sont dans la collection des formes préfixé par « AssetDetails_ ».

En gardant à l'esprit que je dois gérer plus de 20 types de catégories spécifiques (moteur, Maison, etc.) au contrôleur étape de sauvegarde, comment puis-je faire cela sans une sorte de piratage?

Était-ce utile?

La solution

Si vous connaissez le type de AssetDetails, vous pouvez le faire comme ceci:

  1. Prenez le AssetView comme paramètre l'action (lie commun propriétés)
  2. Créer une nouvelle instance de la AssetDetails de spécifiques (par exemple CarDetails)
  3. Utilisez l'une des surcharges de TryUpdateModel pour lier les valeurs. Il y a quelques surcharges qui permettent vous spécifiez le préfixe il doit toujours du travail
  4. Ajouter cet objet à la AssetView.SpecificAsset

Vous avez besoin d'un moyen de connaître le type spécifique. Mais je suppose que vous auriez une variable qui suit le type pour que vous puissiez enregistrer correctement plus tard de toute façon. Si vous ne le faites pas, il serait facile d'ajouter. Rappelez-vous qu'il doit être AssetView que AssetDetails ne sont pas liés bien.

Si vous avez besoin de validation il y a un TryValidateModel vous pouvez essayer aussi.

Autres conseils

Comme je l'ai compris, le nombre de modèles se développera et que vous voulez réutiliser l'action et la vue pour tous les modèles. Une option que je vois est de faire un ModelBinder personnalisé. Vous examineriez FormCollection et que de créer un modèle d'actif spécifique.

Le problème avec votre solution est que SpecificAsset n'a pas de propriétés, de sorte que liant modèle par défaut ne se lie pas l'un des champs à elle.

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