4 Stimmen

Anzeige von komplexen Typen in ASP.NET MVC3 RC2

Ich habe ein Modell, das einen komplexe Typ als Eigenschaft verwendet.

namespace Web.Models {
    public class Business : IModel {
        [Key, HiddenInput(DisplayValue = false)]
        public Guid ID { get; set; }

        public Position Position { get; set; }

        public bool Active { get; set; }

        public ICollection Comments { get; set; }

        public Business() {
            ID = Guid.NewGuid();
            Position = new Position();
        }
    }

    public class Position {
        public double Latitude { get; set; }
        public double Longitude { get; set; }
    }
}

Als ich ein Formular für das Business-Modell erstellen wollte, wurde die Position-Eigenschaft nicht angezeigt. Ich bin sicher, dass komplexe Typen standardmäßig in MVC2 angezeigt wurden. Unter der Annahme, dass dies möglicherweise eine Änderung in MVC3 ist, habe ich die folgenden Schritte versucht, aber ohne Erfolg:

  1. Die Position-Eigenschaft mit dem ScaffoldColumn(true)-Attribut dekoriert.
  2. Eine Position.cshtml-Ansicht in Views\Shared\EditorTemplates erstellt.

Mein aktueller Workaround besteht darin, mein benutzerdefiniertes Object.ascx von MVC2 in ein MVC3 Razor Object.cshtml umzuwandeln. Ich zögere, weil ich mir sicher bin, dass mein benutzerdefiniertes Object.ascx auf dem Original basierte, wie es von Brad Wilson gebloggt wurde.

@if (ViewData.TemplateInfo.TemplateDepth > 1) {
    @ViewData.ModelMetadata.SimpleDisplayText
}
else {

        @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) {
      if (prop.HideSurroundingHtml) {
            @Html.Editor(prop.PropertyName)
      }
      else {

                @(prop.IsRequired ? "*" : "")
                @Html.Label(prop.PropertyName)
                @Html.Editor(prop.PropertyName)
                @Html.ValidationMessage(prop.PropertyName)

      }
  }

}

Also die Fragen lauten:

  1. Hat sich das Standardverhalten geändert oder fehlt mir etwas?
  2. Gibt es einen besseren Weg, um die Sichtbarkeit von komplexen Typen zu steuern?
  3. Ist es möglich, auf die Standardvorlagen in ASP.NET MVC3 zuzugreifen?

Rich

0voto

John Farrell Punkte 24474

Das Standard-Objekt.ascx-Template zeigt nur eine Ebene eines Objektgraphen an.

Es gibt eine Zeile oben, die überprüft, ob die Tiefe > 1 ist und dann das Rendern abbricht.

<% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>

Ändern Sie zu:

<% } else if (ViewData.TemplateInfo.TemplateDepth > 99) { %> 

Oder entfernen Sie das if komplett.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X