Frage

Ich entwickle eine MVC 3 Razor -Web -App, in der Details mehrerer Kategorien von Objekten gespeichert werden. (Fahrzeuge, Häuser, Instrumente usw.). Alle Objekte teilen einige gemeinsame Daten (Titel, Beschreibung usw.) und einige Details, die für die Kategorie spezifisch sind, zu der sie gehört. Die Kategorieliste wird voraussichtlich wachsen und im Hinblick auf die Verringerung der Wartbarkeit hoffen, dass der gleiche Assistent des Add -Objekts wiederverwendet wird. Der Assistent basiert auf der folgenden Implementierung.

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

Mit dem letzten Schritt können der Benutzer im mehrfachen Stufen -Assistenten die kategorienspezifischen Details eingeben (Modell, Make, Vin usw. für ein Fahrzeug). Derzeit habe ich mir diesen letzten Schritt als Teilansicht mit Ajax vorgestellt. Wir werden also tatsächlich partielle Ansichten haben, die die spezifische Kategorie widerspiegeln, aber den Rest des Assistentencodes teilen.

Mein generisches Modellobjekt ist so

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

Die komplexen Eigentumsanlagen werden durch jede Art von Teilansicht dargestellt. Daher enthält die Teilansicht "Motordetails" ein stark typisiertes Modell des Typs Motorasset, das wie unten deklariert wird.

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

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

Die tatsächliche Validierung ist weitaus komplex, aber ich habe diese weggelassen, so dass das leichter zu verstehen ist.

Die Hauptseite der Assistenten wird als deklariert als als

    @model AssetView

  .....

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

Die motorische teilweise Ansicht als

 @model MotorAsset

Meine Frage ist, wie ich in diesem Szenario die Modellvalidierung durchführen kann (oder ist es möglich), da der letzte Schritt nicht auf der Ansichtsseite, sondern auf einer Teilansicht liegt.

War es hilfreich?

Lösung

Warum würden Sie nicht auf die einfachen Klassen (OOP -Paradigma) zurückgreifen, anstatt ein Eigentum AssetDetails in Ihrem AssetView zu haben?

Anstelle dessen, was Sie jetzt haben, sollten Sie das lieber deklarieren

AssetView (generische Eigenschaften) -> Motorview erben AssetView (spezifische Eigenschaften)

So was:

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

Wenn Sie es so lassen möchten, wie Sie es jetzt haben, dann verwenden Sie es EditorFor() und erstellen eine EditorFor Vorlage im gemeinsam genutzten Ordner und stark eingeben MotorAsset (oder SpecificAsset, wenn du es noch generischer willst).

Dann rendern Sie es so:

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

Dadurch kann der Controller es validieren und auf die Eigenschaft in Ihrer AssetView. HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top