Frage

Ich habe den Hintergrund zu dieser Frage vor ein paar Tagen gepostet. Aber die Antwort ist noch unvollständig, also postieren Sie sie mit einer Zusammenfassung neu.

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). Die Ansichtsseite ist an das Modell "assetView" gebunden, das wie folgt definiert ist

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

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

    public SpecificAsset AssetDetails { get; set; }
}

Die Eigenschaft AssetDetails wird zur Laufzeit dynamisch gemäß dem in einer vorherigen Stadium ausgewählten Kategoriestyp geändert. Die Aussicht sieht so aus

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

im Controller basierend auf der Kategorieauswahl. Ich intialisiere AssetDetails wie folgt

_thisAsset.AssetDetails = new MotorAsset();

Ich überschreibe dann die Ansichten mit typen spezifischen Editor -Vorlagen.

Der Assistent funktioniert einwandfrei, aber beim Speichern Schritt im Controller hat die Eigenschaft "assetDetails" keine Werte und es wird gezeigt, dass sie vom Typ "spezifisch asset" ist, der der Basistyp ist. Ich kann es auch nicht auf den spezifischen Typ werfen. Die FormScollection zeigt jedoch alle Werte, die "AssetDetails" spezifischen Eigenschaften wie "Übertragung", "make" in den von "assetDetails_" vorangestellten Formularesammlungen.

Beachten Sie, dass ich über 20 Arten von spezifischen Kategorien (Motor, Haus usw.) beim Save -Schritt von Controller bewältigen muss. Wie kann ich dies ohne eine Art Hack tun?

War es hilfreich?

Lösung

Wenn Sie die Art der AssetDetails kennen, können Sie dies so tun:

  1. Nehmen Sie die AssetView als Parameter an die Aktion (bindet die gemeinsamen Eigenschaften).
  2. Erstellen Sie eine neue Instanz der spezifischen AssetDetails (z. B. Cardetails)
  3. Verwenden Sie eine der Überladungen von TryUpDatemodel, um die Werte zu binden. Es gibt einige Überladungen, mit denen Sie ein Präfix angeben können, damit es immer funktionieren sollte
  4. Fügen Sie dieses Objekt der AssetView.specificasset hinzu

Sie benötigen eine Möglichkeit, den spezifischen Typ zu kennen. Aber ich denke, Sie hätten eine Variable, die den Typ verfolgt, damit Sie ihn trotzdem richtig sparen können. Wenn Sie dies nicht tun, wäre es einfach hinzuzufügen. Denken Sie daran, dass es AssetView sein muss, da AssetDetails jedoch nicht gebunden werden.

Wenn Sie eine Validierung benötigen, gibt es ein Tryvalidatemodel, den Sie auch versuchen könnten.

Andere Tipps

Wie ich verstanden habe, wird die Anzahl der Modelle wachsen und Sie möchten Aktion und Sichtweise für alle Modelle wiederverwenden. Eine Option, die ich sehe, ist die Erstellung eines benutzerdefinierten Modellbinders. Sie würden FormCollection untersuchen und als ein bestimmtes Asset -Modell erstellen.

Das Problem mit Ihrer Lösung besteht darin, dass SpezifischAsset keine Eigenschaften hat, sodass der Standardmodellbinder keine Felder daran bindet.

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