From eefdc40e50e37720ee60b3e76db6d46cc6568ca9 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 27 Nov 2011 12:04:24 +0000 Subject: [PATCH] Generate code for model properties in ASP.NET MVC Edit view T4 templates. --- .../CodeTemplates/AddView/AspxCSharp/Edit.cs | 144 ++++++++++++++---- .../CodeTemplates/AddView/AspxCSharp/Edit.tt | 31 ++++ .../CodeTemplates/AddView/CSHTML/Edit.cs | 127 ++++++++++++--- .../CodeTemplates/AddView/CSHTML/Edit.tt | 31 ++++ .../AddView/AspxVisualBasic/Edit.tt | 28 ++++ .../CodeTemplates/AddView/VBHTML/Edit.tt | 28 ++++ .../AspxCSharpEditViewTemplateTests.cs | 64 ++++++++ .../RazorCSharpEditViewTemplateTests.cs | 64 ++++++++ 8 files changed, 463 insertions(+), 54 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.cs index 007002af9e..146b31723a 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.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 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" + #line 69 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 5 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 8 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 9 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.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\Edit.tt" + #line 12 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" this.Write("\r\n\r\n\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\Edit.tt" + #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" } else { PopIndent(); @@ -228,13 +310,13 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 54 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" + #line 66 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 56 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" + #line 68 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Edit.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.tt index a0f2c67b80..c2a4066c79 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Edit.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() #>" %> @@ -31,6 +33,16 @@ <%: Html.ValidationSummary(true) %>
<#= MvcHost.ViewDataType.Name #> +<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> + +
+ <%: Html.LabelFor(model => model.<#= modelProperty.Name#>) %> +
+
+ <%: Html.EditorFor(model => model.<#= modelProperty.Name#>) %> + <%: Html.ValidationMessageFor(model => model.<#= modelProperty.Name#>) %> +
+<# } #>

@@ -59,6 +71,11 @@ get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetViewPageType() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -67,4 +84,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/Edit.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.cs index 8e41e6af7c..2b0a62c877 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.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 53 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 6 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 8 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 13 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 14 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 14 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 15 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 15 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 18 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 18 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 20 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 23 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 26 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 26 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.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\Edit.tt" + #line 29 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" PushIndent("\t\t"); } @@ -148,27 +169,87 @@ 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\Edit.tt" + #line 33 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" this.Write("@using (Html.BeginForm()) {\r\n\t@Html.ValidationSummary(true)\r\n\t
\r\n\t\t"); #line default #line hidden - #line 34 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + #line 36 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" this.Write(this.ToStringHelper.ToStringWithCulture( MvcHost.ViewDataType.Name )); #line default #line hidden - #line 34 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" - this.Write("\r\n\t\t\r\n\t\t

\r\n\t\t\t\r\n\t\t

\r\n\t\r\n}\r\n
\r\n\t@Html.ActionLink(\"Back\", \"Index\")\r\n
\r\n"); + #line 36 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write("\r\n"); + + #line default + #line hidden + + #line 37 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + foreach (ModelProperty modelProperty in GetModelProperties()) { + + #line default + #line hidden + + #line 38 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write("\t\t\r\n\t\t
\r\n\t\t\t@Html.LabelFor(model => model."); + + #line default + #line hidden + + #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); + + #line default + #line hidden + + #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(")\r\n\t\t
\r\n\t\t
\r\n\t\t\t@Html.EditorFor(model => model."); + + #line default + #line hidden + + #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); + + #line default + #line hidden + + #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(")\r\n\t\t\t@Html.ValidationMessageFor(model => model."); + + #line default + #line hidden + + #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); #line default #line hidden #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write(")\r\n\t\t
\r\n"); + + #line default + #line hidden + + #line 46 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + } + + #line default + #line hidden + + #line 47 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + this.Write("\t\t\r\n\t\t

\r\n\t\t\t\r\n\t\t

\r\n\t
\r\n}\r\n
" + + "\r\n\t@Html.ActionLink(\"Back\", \"Index\")\r\n
\r\n"); + + #line default + #line hidden + + #line 56 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -179,13 +260,13 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 50 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" + #line 64 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Edit.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.tt index 2c1ea3ab0d..5e1e6e06b0 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Edit.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() #> @@ -32,6 +34,16 @@ @Html.ValidationSummary(true)
<#= MvcHost.ViewDataType.Name #> +<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> + +
+ @Html.LabelFor(model => model.<#= modelProperty.Name #>) +
+
+ @Html.EditorFor(model => model.<#= modelProperty.Name #>) + @Html.ValidationMessageFor(model => model.<#= modelProperty.Name #>) +
+<# } #>

@@ -55,6 +67,11 @@ get { return (MvcTextTemplateHost)Host; } } + public class ModelProperty + { + public string Name { get; set; } + } + public string GetModelDirective() { string viewDataTypeName = MvcHost.ViewDataTypeName; @@ -63,4 +80,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/Edit.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Edit.tt index b88095812e..564f1ab305 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Edit.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Edit.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() #>" %> @@ -32,6 +34,16 @@ <%: Html.ValidationSummary(True) %>

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

@@ -62,6 +74,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 @@ -69,4 +85,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/Edit.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Edit.tt index 7b4d5d333f..e3da5d0d06 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Edit.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Edit.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() #> @@ -33,6 +35,16 @@ End Code @Html.ValidationSummary(True) @

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

@@ -58,6 +70,10 @@ End Using 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 @@ -65,4 +81,16 @@ End Using 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/AspxCSharpEditViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpEditViewTemplateTests.cs index f13e7382fe..5756217fba 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpEditViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpEditViewTemplateTests.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(); + } + + Edit.ModelProperty GetFirstModelProperty() + { + return GetModelProperties().First(); + } + [Test] public void GetViewPageType_HostViewDataTypeNameIsMyAppMyModel_ReturnsMyAppMyModelSurroundedByAngleBrackets() { @@ -162,6 +175,57 @@ MyView

<%: Html.ActionLink(""Back"", ""Index"") %>
+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasOnePropertyCalledName_ReturnsModelPropertyCalledName() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + Edit.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"" %> + +<% using (Html.BeginForm()) { %> + <%: Html.ValidationSummary(true) %> +
+ ModelWithOneProperty + +
+ <%: Html.LabelFor(model => model.Name) %> +
+
+ <%: Html.EditorFor(model => model.Name) %> + <%: Html.ValidationMessageFor(model => model.Name) %> +
+ +

+ +

+
+<% } %> +
+ <%: Html.ActionLink(""Back"", ""Index"") %> +
"; Assert.AreEqual(expectedOutput, output); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpEditViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpEditViewTemplateTests.cs index 6d2d365d28..adc7d84acb 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpEditViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpEditViewTemplateTests.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(); + } + + Edit.ModelProperty GetFirstModelProperty() + { + return GetModelProperties().First(); + } + [Test] public void GetModelDirective_HostViewDataTypeNameIsMyAppMyModel_ReturnsRazorModelFollowedByMyAppMyModel() { @@ -163,6 +176,57 @@ namespace AspNet.Mvc.Tests.CodeTemplates
@Html.ActionLink(""Back"", ""Index"")
+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasOnePropertyCalledName_ReturnsModelPropertyCalledName() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + Edit.ModelProperty modelProperty = GetFirstModelProperty(); + + Assert.AreEqual("Name", modelProperty.Name); + } + + [Test] + public void TransformText_ModelHasOnePropertyAndIsPartialView_ReturnsControlWithHtmlHelpersForModelProperty() + { + 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 + +@using (Html.BeginForm()) { + @Html.ValidationSummary(true) +
+ ModelWithOneProperty + +
+ @Html.LabelFor(model => model.Name) +
+
+ @Html.EditorFor(model => model.Name) + @Html.ValidationMessageFor(model => model.Name) +
+ +

+ +

+
+} +
+ @Html.ActionLink(""Back"", ""Index"") +
"; Assert.AreEqual(expectedOutput, output); }