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:
- Die Position-Eigenschaft mit dem
ScaffoldColumn(true)
-Attribut dekoriert. - 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:
- Hat sich das Standardverhalten geändert oder fehlt mir etwas?
- Gibt es einen besseren Weg, um die Sichtbarkeit von komplexen Typen zu steuern?
- Ist es möglich, auf die Standardvorlagen in ASP.NET MVC3 zuzugreifen?
Rich