From 07349f96571d1c385ad19e8a6890b9d4858ff63e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 27 Nov 2011 11:19:14 +0000 Subject: [PATCH] Generate code for model properties in ASP.NET MVC Details view T4 templates. --- .../AddView/AspxCSharp/Details.cs | 132 ++++++++++++++---- .../AddView/AspxCSharp/Details.tt | 30 ++++ .../CodeTemplates/AddView/CSHTML/Details.cs | 115 ++++++++++++--- .../CodeTemplates/AddView/CSHTML/Details.tt | 30 ++++ .../AddView/AspxVisualBasic/Details.tt | 27 ++++ .../CodeTemplates/AddView/VBHTML/Details.tt | 27 ++++ .../AspxCSharpDetailsViewTemplateTests.cs | 57 ++++++++ .../RazorCSharpDetailsViewTemplateTests.cs | 57 ++++++++ 8 files changed, 421 insertions(+), 54 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs index 8b0ee8537d..10b0b699f8 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.cs @@ -10,6 +10,8 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { using ICSharpCode.AspNet.Mvc; + using System.Collections.Generic; + using System.Reflection; using System; @@ -18,12 +20,17 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 51 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" MvcTextTemplateHost MvcHost { get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetViewPageType() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -32,6 +39,20 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { } return String.Empty; } + + public IEnumerable GetModelProperties() + { + var properties = new List(); + foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { + properties.Add(CreateModelProperty(propertyInfo)); + } + return properties; + } + + ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + { + return new ModelProperty() { Name = propertyInfo.Name }; + } #line default #line hidden @@ -49,92 +70,92 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { public virtual string TransformText() { this.GenerationEnvironment = null; - #line 3 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 5 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" if (MvcHost.IsPartialView) { #line default #line hidden - #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("<%@ Control Language=\"C#\" Inherits=\"System.Web.Mvc.ViewUserControl"); #line default #line hidden - #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( GetViewPageType() )); #line default #line hidden - #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\" %>\r\n\r\n"); #line default #line hidden - #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 8 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" } else if (MvcHost.IsContentPage) { #line default #line hidden - #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("<%@ Page Language=\"C#\" MasterPageFile=\""); #line default #line hidden - #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.MasterPageFile )); #line default #line hidden - #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\" Inherits=\"System.Web.Mvc.ViewPage"); #line default #line hidden - #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( GetViewPageType() )); #line default #line hidden - #line 7 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\" %>\r\n\r\n\r\n" + ""); #line default #line hidden - #line 10 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewName )); #line default #line hidden - #line 10 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\r\n\r\n\r\n\r\n"); #line default #line hidden - #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" } else { PopIndent(); @@ -227,13 +297,13 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 48 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 59 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 50 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 61 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt index be938dd74f..6ffc8596b0 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Details.tt @@ -1,5 +1,7 @@ <#@ template language="C#" HostSpecific="true" #> <#@ import namespace="ICSharpCode.AspNet.Mvc" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Reflection" #> <# if (MvcHost.IsPartialView) { #> <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<#= GetViewPageType() #>" %> @@ -29,6 +31,15 @@ #>
<#= MvcHost.ViewDataType.Name #> +<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> + +
+ <%: Html.LabelFor(model => model.<#= modelProperty.Name#>) %> +
+
+ <%: Html.DisplayFor(model => model.<#= modelProperty.Name#>) %> +
+<# } #>

<%: Html.ActionLink("Edit", "Edit") %> | @@ -53,6 +64,11 @@ get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetViewPageType() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -61,4 +77,18 @@ } return String.Empty; } + + public IEnumerable GetModelProperties() + { + var properties = new List(); + foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { + properties.Add(CreateModelProperty(propertyInfo)); + } + return properties; + } + + ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + { + return new ModelProperty() { Name = propertyInfo.Name }; + } #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.cs index 6c9cd49014..d2bb491283 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.cs @@ -10,6 +10,8 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { using ICSharpCode.AspNet.Mvc; + using System.Collections.Generic; + using System.Reflection; using System; @@ -18,12 +20,17 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 47 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 58 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" MvcTextTemplateHost MvcHost { get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetModelDirective() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -32,6 +39,20 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { } return String.Empty; } + + public IEnumerable GetModelProperties() + { + var properties = new List(); + foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { + properties.Add(CreateModelProperty(propertyInfo)); + } + return properties; + } + + ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + { + return new ModelProperty() { Name = propertyInfo.Name }; + } #line default #line hidden @@ -49,19 +70,19 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { public virtual string TransformText() { this.GenerationEnvironment = null; - #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( GetModelDirective() )); #line default #line hidden - #line 4 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\r\n\r\n"); #line default #line hidden - #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 8 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -71,49 +92,49 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 11 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 13 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("@{\r\n\tViewBag.Title = \""); #line default #line hidden - #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 14 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewName )); #line default #line hidden - #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 14 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\";\r\n\tLayout = \""); #line default #line hidden - #line 13 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 15 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.MasterPageFile )); #line default #line hidden - #line 13 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 15 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\";\r\n}\r\n\r\n

"); #line default #line hidden - #line 16 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 18 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewName )); #line default #line hidden - #line 16 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 18 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("

\r\n\r\n"); #line default #line hidden - #line 18 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 20 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" } else { @@ -121,25 +142,25 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 21 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 23 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\r\n\r\n\t\r\n\t\t"); #line default #line hidden - #line 24 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 26 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewName )); #line default #line hidden - #line 24 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 26 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\r\n\t\r\n\t\r\n"); #line default #line hidden - #line 27 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 29 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" PushIndent("\t\t"); } @@ -148,26 +169,74 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 31 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 33 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("
\r\n\t"); #line default #line hidden - #line 32 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 34 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewDataType.Name )); #line default #line hidden - #line 32 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" - this.Write("\r\n
\r\n

\r\n\t@Html.ActionLink(\"Edit\", \"Edit\") |\r\n\t@Html.ActionLi" + - "nk(\"Back\", \"Index\")\r\n

\r\n"); + #line 34 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\r\n"); + + #line default + #line hidden + + #line 35 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + foreach (ModelProperty modelProperty in GetModelProperties()) { + + #line default + #line hidden + + #line 36 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\t\r\n\t
\r\n\t\t@Html.LabelFor(model => model."); #line default #line hidden #line 38 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); + + #line default + #line hidden + + #line 38 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write(")\r\n\t
\r\n\t
\r\n\t\t@Html.DisplayFor(model => model."); + + #line default + #line hidden + + #line 41 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); + + #line default + #line hidden + + #line 41 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write(")\r\n\t
\r\n"); + + #line default + #line hidden + + #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + } + + #line default + #line hidden + + #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\r\n

\r\n\t@Html.ActionLink(\"Edit\", \"Edit\") |\r\n\t@Html.ActionLink(\"Back\", " + + "\"Index\")\r\n

\r\n"); + + #line default + #line hidden + + #line 49 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -178,13 +247,13 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 46 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.tt index bcd53dc576..f569de2218 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.tt @@ -1,5 +1,7 @@ <#@ template language="C#" HostSpecific="true" #> <#@ import namespace="ICSharpCode.AspNet.Mvc" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Reflection" #> <#@ output extension=".cshtml" #> <#= GetModelDirective() #> @@ -30,6 +32,15 @@ #>
<#= MvcHost.ViewDataType.Name #> +<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> + +
+ @Html.LabelFor(model => model.<#= modelProperty.Name #>) +
+
+ @Html.DisplayFor(model => model.<#= modelProperty.Name #>) +
+<# } #>

@Html.ActionLink("Edit", "Edit") | @@ -49,6 +60,11 @@ get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetModelDirective() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -57,4 +73,18 @@ } return String.Empty; } + + public IEnumerable GetModelProperties() + { + var properties = new List(); + foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { + properties.Add(CreateModelProperty(propertyInfo)); + } + return properties; + } + + ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + { + return new ModelProperty() { Name = propertyInfo.Name }; + } #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Details.tt index 9ad3eaea07..1ac68a8ae9 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Details.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Details.tt @@ -1,6 +1,8 @@ <#@ template language="VB" HostSpecific="true" #> <#@ import namespace="ICSharpCode.AspNet.Mvc" #> <#@ import namespace="Microsoft.VisualBasic.Constants" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Reflection" #> <# If MvcHost.IsPartialView Then #> <%@ Control Language="VB" Inherits="System.Web.Mvc.ViewUserControl<#= GetViewPageType() #>" %> @@ -30,6 +32,15 @@ #>

<#= MvcHost.ViewDataType.Name #> +<# For Each modelProperty As ModelProperty in GetModelProperties() #> + +
+ <%: Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) %> +
+
+ <%: Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>) %> +
+<# Next #>

<%: Html.ActionLink("Edit", "Edit") %> | @@ -56,6 +67,10 @@ End Get End Property + Public Class ModelProperty + Public Property Name As String + End Class + Public Function GetViewPageType() As String Dim viewDataTypeName As String = MvcHost.ViewDataTypeName If Not String.IsNullOrEmpty(viewDataTypeName) Then @@ -63,4 +78,16 @@ End If Return String.Empty End Function + + Public Function GetModelProperties() As IEnumerable(Of ModelProperty) + Dim properties = New List(Of ModelProperty)() + For Each propertyInfo As PropertyInfo In MvcHost.GetViewDataTypeProperties() + properties.Add(CreateModelProperty(propertyInfo)) + Next + Return properties + End Function + + Function CreateModelProperty(ByVal propertyInfo As PropertyInfo) As ModelProperty + Return New ModelProperty() With { .Name = propertyInfo.Name } + End Function #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Details.tt index e02b2860f5..a5cb2f23b6 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Details.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Details.tt @@ -1,6 +1,8 @@ <#@ template language="VB" HostSpecific="true" #> <#@ import namespace="ICSharpCode.AspNet.Mvc" #> <#@ import namespace="Microsoft.VisualBasic.Constants" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Reflection" #> <#@ output extension=".vbhtml" #> <#= GetModelDirective() #> @@ -31,6 +33,15 @@ End Code #>

<#= MvcHost.ViewDataType.Name #> +<# For Each modelProperty As ModelProperty in GetModelProperties() #> + +
+ @Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) +
+
+ @Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>) +
+<# Next #>

@Html.ActionLink("Edit", "Edit") | @@ -52,6 +63,10 @@ End Code End Get End Property + Public Class ModelProperty + Public Property Name As String + End Class + Function GetModelDirective() As String Dim viewDataTypeName As String = MvcHost.ViewDataTypeName If Not String.IsNullOrEmpty(viewDataTypeName) Then @@ -59,4 +74,16 @@ End Code End If Return String.Empty End Function + + Public Function GetModelProperties() As IEnumerable(Of ModelProperty) + Dim properties = New List(Of ModelProperty)() + For Each propertyInfo As PropertyInfo In MvcHost.GetViewDataTypeProperties() + properties.Add(CreateModelProperty(propertyInfo)) + Next + Return properties + End Function + + Function CreateModelProperty(ByVal propertyInfo As PropertyInfo) As ModelProperty + Return New ModelProperty() With { .Name = propertyInfo.Name } + End Function #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs index d2d368d736..0916ba0abb 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs @@ -2,6 +2,9 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; +using System.Linq; + using AspNet.Mvc.Tests.CodeTemplates.Models; using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc.AspxCSharp; @@ -22,6 +25,16 @@ namespace AspNet.Mvc.Tests.CodeTemplates templatePreprocessor.Host = mvcHost; } + IEnumerable GetModelProperties() + { + return templatePreprocessor.GetModelProperties(); + } + + Details.ModelProperty GetFirstModelProperty() + { + return GetModelProperties().First(); + } + [Test] public void GetViewPageType_HostViewDataTypeNameIsMyAppMyModel_ReturnsMyAppMyModelSurroundedByAngleBrackets() { @@ -144,6 +157,50 @@ MyView <%: Html.ActionLink(""Back"", ""Index"") %>

+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasOnePropertyCalledName_ReturnsModelPropertyCalledName() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + Details.ModelProperty modelProperty = GetFirstModelProperty(); + + Assert.AreEqual("Name", modelProperty.Name); + } + + [Test] + public void TransformText_ModelHasOnePropertyAndIsPartialView_ReturnsControlWithFormAndHtmlHelpersForModelProperty() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsPartialView = true; + Type modelType = typeof(ModelWithOneProperty); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl"" %> + +
+ ModelWithOneProperty + +
+ <%: Html.LabelFor(model => model.Name) %> +
+
+ <%: Html.DisplayFor(model => model.Name) %> +
+
+

+ <%: Html.ActionLink(""Edit"", ""Edit"") %> | + <%: Html.ActionLink(""Back"", ""Index"") %> +

"; Assert.AreEqual(expectedOutput, output); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs index 7569b1ac45..999354d7f4 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs @@ -2,6 +2,9 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; +using System.Linq; + using AspNet.Mvc.Tests.CodeTemplates.Models; using AspNet.Mvc.Tests.Helpers; using ICSharpCode.AspNet.Mvc.CSHtml; @@ -22,6 +25,16 @@ namespace AspNet.Mvc.Tests.CodeTemplates templatePreprocessor.Host = mvcHost; } + IEnumerable GetModelProperties() + { + return templatePreprocessor.GetModelProperties(); + } + + Details.ModelProperty GetFirstModelProperty() + { + return GetModelProperties().First(); + } + [Test] public void GetModelDirective_HostViewDataTypeNameIsMyAppMyModel_ReturnsRazorModelFollowedByMyAppMyModel() { @@ -145,6 +158,50 @@ namespace AspNet.Mvc.Tests.CodeTemplates @Html.ActionLink(""Edit"", ""Edit"") | @Html.ActionLink(""Back"", ""Index"")

+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasOnePropertyCalledName_ReturnsModelPropertyCalledName() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + Details.ModelProperty modelProperty = GetFirstModelProperty(); + + Assert.AreEqual("Name", modelProperty.Name); + } + + [Test] + public void TransformText_ModelHasOnePropertyAndIsPartialView_ReturnsControlWithHtmlHelperForModelProperty() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsPartialView = true; + Type modelType = typeof(ModelWithOneProperty); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"@model AspNet.Mvc.Tests.CodeTemplates.Models.ModelWithOneProperty + +
+ ModelWithOneProperty + +
+ @Html.LabelFor(model => model.Name) +
+
+ @Html.DisplayFor(model => model.Name) +
+
+

+ @Html.ActionLink(""Edit"", ""Edit"") | + @Html.ActionLink(""Back"", ""Index"") +

"; Assert.AreEqual(expectedOutput, output); }