I have a model that uses a complex type as a property.
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<Comment> Comments { get; set; }
public Business() {
ID = Guid.NewGuid();
Position = new Position();
}
}
public class Position {
public double Latitude { get; set; }
public double Longitude { get; set; }
}
}
When I came to create a form of the Business model, the Position property wasn't displayed. I'm sure complex types were displayed by default in MVC2. Assuming that this might be a switch in MVC3 I tried the following steps to no avail:
- Decorated the Position property with the
ScaffoldColumn(true)
attribute. - Created a Position.cshtml view in Views\Shared\EditorTemplates.
My current workaround has been to convert my custom Object.ascx from MVC2 to an MVC3 Razor Object.cshtml. My hesitation is that I'm positive my custom Object.ascx was based on the original as blogged by Brad Wilson.
@if (ViewData.TemplateInfo.TemplateDepth > 1) {
@ViewData.ModelMetadata.SimpleDisplayText
}
else {
<div class="editor">
@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) {
if (prop.HideSurroundingHtml) {
@Html.Editor(prop.PropertyName)
}
else {
<div class="field">
@(prop.IsRequired ? "*" : "")
@Html.Label(prop.PropertyName)
@Html.Editor(prop.PropertyName)
@Html.ValidationMessage(prop.PropertyName)
</div>
}
}
</div>
}
So questions are:
- Has the default behaviour changed or am I missing something?
- Is there a better way to switch on the visibility of complex types?
- Is it possible to access the default templates in ASP.NET MVC3?
Rich