<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #> <#@ Output extension="aspx" #> <#@ assembly name="System.ComponentModel.DataAnnotations" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Data.Entity" #> <#@ assembly name="System.Data.Linq" #> <#@ import namespace="System" #> <#@ import namespace="System.Collections" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.ComponentModel.DataAnnotations" #> <#@ import namespace="System.Data.Linq.Mapping" #> <#@ import namespace="System.Data.Objects.DataClasses" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Reflection" #> <# var viewDataType = (EnvDTE.CodeType) Model.ViewDataType; #> <# string mvcViewDataTypeGenericString = (viewDataType != null) ? "<" + viewDataType.FullName + ">" : ""; int CPHCounter = 1; #> <# if(Model.IsContentPage) { #> <%@ Page Title="" Language="C#" MasterPageFile="~<#= Model.Layout #>" Inherits="System.Web.Mvc.ViewPage<#= mvcViewDataTypeGenericString #>" %> <# foreach(string cphid in Model.SectionNames) { if(cphid.Equals("TitleContent", StringComparison.OrdinalIgnoreCase)) { #> <#= Model.ViewName #> <# CPHCounter++; } } #>

<#= Model.ViewName #>

<# } else { #> <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<#= mvcViewDataTypeGenericString #>" %> <#= Model.ViewName #> <# PushIndent(" "); } #> <# if (Model.ReferenceScriptLibraries) { #> <# if (!Model.IsContentPage) { #> <# } #> <# } #> <% using (Html.BeginForm()) { %> <%: Html.ValidationSummary(true) %>
<#= Model.ViewDataTypeName ?? String.Empty #> <%: Html.Partial("CreateOrEdit", Model) %>

<% } %>
<%: Html.ActionLink("Back to List", "Index") %>
<# // The following code closes the asp:Content tag used in the case of a master page and the body and html tags in the case of a regular view page #> <# if(Model.IsContentPage) { #>
<# foreach(string cphid in Model.SectionNames) { if(!cphid.Equals("TitleContent", StringComparison.OrdinalIgnoreCase) && !cphid.Equals(Model.PrimarySectionName, StringComparison.OrdinalIgnoreCase)) { CPHCounter++; #> <# } } #> <# } else if(!Model.IsContentPage) { ClearIndent(); #> <# } #> <#+ // Describes the information about a property on the model class ModelProperty { public string Name { get; set; } public string ValueExpression { get; set; } public EnvDTE.CodeTypeRef Type { get; set; } public bool IsPrimaryKey { get; set; } public bool IsForeignKey { get; set; } public bool IsReadOnly { get; set; } } // Change this list to include any non-primitive types you think should be eligible to be edited using a textbox static Type[] bindableNonPrimitiveTypes = new[] { typeof(string), typeof(decimal), typeof(Guid), typeof(DateTime), typeof(DateTimeOffset), typeof(TimeSpan), }; // Call this to get the list of properties in the model. Change this to modify or add your // own default formatting for display values. List GetModelProperties(EnvDTE.CodeType typeInfo, bool includeUnbindableProperties) { List results = GetEligibleProperties(typeInfo, includeUnbindableProperties); foreach (ModelProperty prop in results) { if (prop.Type.UnderlyingTypeIs() || prop.Type.UnderlyingTypeIs()) { prop.ValueExpression = "String.Format(\"{0:F}\", " + prop.ValueExpression + ")"; } else if (prop.Type.UnderlyingTypeIs()) { prop.ValueExpression = "String.Format(\"{0:g}\", " + prop.ValueExpression + ")"; } else if (!IsBindableType(prop.Type)) { prop.ValueExpression = GetValueExpression("Model." + prop.Name, (EnvDTE.CodeType)prop.Type.CodeType); } } return results; } // Change this list to include the names of properties that should be selected to represent an entity as a single string static string[] displayPropertyNames = new[] { "Name", "Title", "LastName", "Surname", "Subject", "Count" }; string GetValueExpression(string propertyExpression, EnvDTE.CodeType propertyType) { if (propertyType != null) { var chosenSubproperty = propertyType.DisplayColumnProperty() ?? propertyType.FindProperty(displayPropertyNames); if (chosenSubproperty != null) { var toStringSuffix = chosenSubproperty.Type.AsFullName == "System.String" ? "" : ".ToString()"; return String.Format("({0} == null ? \"None\" : {0}.{1}{2})", propertyExpression, chosenSubproperty.Name, toStringSuffix); } } return "Html.DisplayTextFor(_ => " + propertyExpression + ").ToString()"; } // Helper List GetEligibleProperties(EnvDTE.CodeType typeInfo, bool includeUnbindableProperties) { List results = new List(); if (typeInfo != null) { foreach (var prop in typeInfo.VisibleMembers().OfType()) { if (prop.IsReadable() && !prop.HasIndexParameters() && (includeUnbindableProperties || IsBindableType(prop.Type))) { results.Add(new ModelProperty { Name = prop.Name, ValueExpression = "Model." + prop.Name, Type = prop.Type, IsPrimaryKey = Model.PrimaryKeyName == prop.Name, IsForeignKey = ParentRelations.Any(x => x.RelationProperty == prop), IsReadOnly = !prop.IsWriteable() }); } } } return results; } IEnumerable ParentRelations { get { return ((IEnumerable)Model.RelatedEntities).OfType().Where(x => x.RelationType == RelationType.Parent); } } // Helper bool IsBindableType(EnvDTE.CodeTypeRef type) { return type.UnderlyingIsPrimitive() || bindableNonPrimitiveTypes.Any(x => type.UnderlyingTypeIs(x)); } #>