From 392ba8707e991966100cdb24d8bfca745b5a0b57 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 1 Dec 2011 19:25:16 +0000 Subject: [PATCH] Treat Id model property as primary key in ASP.NET MVC List T4 template. --- .../CodeTemplates/AddView/AspxCSharp/List.cs | 168 +++++++++++++++--- .../CodeTemplates/AddView/AspxCSharp/List.tt | 61 ++++++- .../CodeTemplates/AddView/CSHTML/List.cs | 164 ++++++++++++++--- .../CodeTemplates/AddView/CSHTML/List.tt | 61 ++++++- .../AddView/AspxVisualBasic/List.tt | 70 ++++++-- .../CodeTemplates/AddView/VBHTML/List.tt | 70 ++++++-- .../AspxCSharpListViewTemplateTests.cs | 114 ++++++++++++ .../RazorCSharpListViewTemplateTests.cs | 114 ++++++++++++ 8 files changed, 730 insertions(+), 92 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.cs index e4ce49b3f7..db4dcaf210 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 90 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 100 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" MvcTextTemplateHost MvcHost { get { return (MvcTextTemplateHost)Host; } @@ -29,6 +29,23 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { public class ModelProperty { public string Name { get; set; } + public bool IsPrimaryKey { get; set; } + + public ModelProperty(PropertyInfo propertyInfo) + { + this.Name = propertyInfo.Name; + this.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo); + } + + bool IsPrimaryKeyProperty(PropertyInfo propertyInfo) + { + return IsMatchIgnoringCase(propertyInfo.Name, "id"); + } + + static bool IsMatchIgnoringCase(string a, string b) + { + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + } } public string GetViewPageType() @@ -51,22 +68,42 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { } } - bool ModelHasProperties { - get { return ModelProperties.Count > 0; } - } - public IEnumerable GetModelProperties() { var properties = new List(); foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { - properties.Add(CreateModelProperty(propertyInfo)); + properties.Add(new ModelProperty(propertyInfo)); } return properties; } - ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + bool ModelHasProperties { + get { return ModelProperties.Count > 0; } + } + + bool ModelHasPrimaryKey { + get { return ModelPrimaryKeyName.Length > 0; } + } + + string modelPrimaryKeyName; + + string ModelPrimaryKeyName { + get { + if (modelPrimaryKeyName == null) { + modelPrimaryKeyName = GetModelPrimaryKeyName(); + } + return modelPrimaryKeyName; + } + } + + public string GetModelPrimaryKeyName() { - return new ModelProperty() { Name = propertyInfo.Name }; + foreach (ModelProperty modelProperty in ModelProperties) { + if (modelProperty.IsPrimaryKey) { + return modelProperty.Name; + } + } + return ""; } #line default @@ -241,44 +278,46 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #line default #line hidden - #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("\t\t\r\n\t\t\t<%: Html.LabelFor(model => model."); #line default #line hidden - #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.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\AspxCSharp\List.tt" + #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.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\AspxCSharp\List.tt" + #line 47 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + } } #line default #line hidden - #line 49 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 51 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("\t\t\r\n\t\r\n\t\r\n"); #line default #line hidden - #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 54 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" } @@ -286,41 +325,43 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("<% foreach (var item in Model) { %>\r\n\t\r\n"); #line default #line hidden - #line 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 59 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" if (ModelHasProperties) { foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #line default #line hidden - #line 61 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 64 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("\t\t\r\n\t\t\t<%: Html.DisplayFor(model => model."); #line default #line hidden - #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); #line default #line hidden - #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write(") %>\r\n\t\t\r\n"); #line default #line hidden - #line 64 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 67 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + } } } @@ -328,15 +369,86 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 68 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" - this.Write("\t\t\r\n\t\t\t<%: Html.ActionLink(\"Edit\", \"Edit\") %> |\r\n\t\t\t<%: Html.ActionLink(\"Deta" + - "ils\", \"Details\") %> |\r\n\t\t\t<%: Html.ActionLink(\"Delete\", \"Delete\") %>\r\n\t\t\r\n\t" + - "\r\n<% } %>\r\n\r\n"); + #line 72 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write("\t\t\r\n"); + + #line default + #line hidden + + #line 73 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + if (ModelHasPrimaryKey) { + + #line default + #line hidden + + #line 74 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write("\t\t\t<%: Html.ActionLink(\"Edit\", \"Edit\", new { id = item."); + + #line default + #line hidden + + #line 74 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 74 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(" }) %> |\r\n\t\t\t<%: Html.ActionLink(\"Details\", \"Details\", new { id = item."); + + #line default + #line hidden + + #line 75 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 75 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(" }) %> |\r\n\t\t\t<%: Html.ActionLink(\"Delete\", \"Delete\", new { id = item."); + + #line default + #line hidden + + #line 76 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); #line default #line hidden #line 76 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write(" }) %>\r\n"); + + #line default + #line hidden + + #line 77 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + } else { + + #line default + #line hidden + + #line 78 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write("\t\t\t<%: Html.ActionLink(\"Edit\", \"Edit\") %> |\r\n\t\t\t<%: Html.ActionLink(\"Details\", \"D" + + "etails\") %> |\r\n\t\t\t<%: Html.ActionLink(\"Delete\", \"Delete\") %>\r\n"); + + #line default + #line hidden + + #line 81 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + } + + #line default + #line hidden + + #line 82 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + this.Write("\t\t\r\n\t\r\n<% } %>\r\n\r\n"); + + #line default + #line hidden + + #line 86 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -347,13 +459,13 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 82 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 92 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("\r\n"); #line default #line hidden - #line 83 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 93 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" } else { PopIndent(); @@ -362,13 +474,13 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 87 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 97 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 89 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" + #line 99 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\List.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.tt index bb3c5bfdea..11c004470d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/List.tt @@ -39,11 +39,13 @@ <# foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #> <%: Html.LabelFor(model => model.<#= modelProperty.Name #>) %> <# + } } #> @@ -57,18 +59,26 @@ <# if (ModelHasProperties) { foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #> <%: Html.DisplayFor(model => model.<#= modelProperty.Name #>) %> <# + } } } #> +<# if (ModelHasPrimaryKey) {#> + <%: Html.ActionLink("Edit", "Edit", new { id = item.<#= ModelPrimaryKeyName #> }) %> | + <%: Html.ActionLink("Details", "Details", new { id = item.<#= ModelPrimaryKeyName #> }) %> | + <%: Html.ActionLink("Delete", "Delete", new { id = item.<#= ModelPrimaryKeyName #> }) %> +<# } else { #> <%: Html.ActionLink("Edit", "Edit") %> | <%: Html.ActionLink("Details", "Details") %> | <%: Html.ActionLink("Delete", "Delete") %> +<# } #> <% } %> @@ -95,6 +105,23 @@ public class ModelProperty { public string Name { get; set; } + public bool IsPrimaryKey { get; set; } + + public ModelProperty(PropertyInfo propertyInfo) + { + this.Name = propertyInfo.Name; + this.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo); + } + + bool IsPrimaryKeyProperty(PropertyInfo propertyInfo) + { + return IsMatchIgnoringCase(propertyInfo.Name, "id"); + } + + static bool IsMatchIgnoringCase(string a, string b) + { + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + } } public string GetViewPageType() @@ -117,21 +144,41 @@ } } - bool ModelHasProperties { - get { return ModelProperties.Count > 0; } - } - public IEnumerable GetModelProperties() { var properties = new List(); foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { - properties.Add(CreateModelProperty(propertyInfo)); + properties.Add(new ModelProperty(propertyInfo)); } return properties; } - ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + bool ModelHasProperties { + get { return ModelProperties.Count > 0; } + } + + bool ModelHasPrimaryKey { + get { return ModelPrimaryKeyName.Length > 0; } + } + + string modelPrimaryKeyName; + + string ModelPrimaryKeyName { + get { + if (modelPrimaryKeyName == null) { + modelPrimaryKeyName = GetModelPrimaryKeyName(); + } + return modelPrimaryKeyName; + } + } + + public string GetModelPrimaryKeyName() { - return new ModelProperty() { Name = propertyInfo.Name }; + foreach (ModelProperty modelProperty in ModelProperties) { + if (modelProperty.IsPrimaryKey) { + return modelProperty.Name; + } + } + return ""; } #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.cs index 6c79cfd598..9caae3168d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 86 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 96 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" MvcTextTemplateHost MvcHost { get { return (MvcTextTemplateHost)Host; } @@ -29,6 +29,23 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { public class ModelProperty { public string Name { get; set; } + public bool IsPrimaryKey { get; set; } + + public ModelProperty(PropertyInfo propertyInfo) + { + this.Name = propertyInfo.Name; + this.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo); + } + + bool IsPrimaryKeyProperty(PropertyInfo propertyInfo) + { + return IsMatchIgnoringCase(propertyInfo.Name, "id"); + } + + static bool IsMatchIgnoringCase(string a, string b) + { + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + } } public string GetModelDirective() @@ -51,22 +68,42 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { } } - bool ModelHasProperties { - get { return ModelProperties.Count > 0; } - } - public IEnumerable GetModelProperties() { var properties = new List(); foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { - properties.Add(CreateModelProperty(propertyInfo)); + properties.Add(new ModelProperty(propertyInfo)); } return properties; } - ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + bool ModelHasProperties { + get { return ModelProperties.Count > 0; } + } + + bool ModelHasPrimaryKey { + get { return ModelPrimaryKeyName.Length > 0; } + } + + string modelPrimaryKeyName; + + string ModelPrimaryKeyName { + get { + if (modelPrimaryKeyName == null) { + modelPrimaryKeyName = GetModelPrimaryKeyName(); + } + return modelPrimaryKeyName; + } + } + + public string GetModelPrimaryKeyName() { - return new ModelProperty() { Name = propertyInfo.Name }; + foreach (ModelProperty modelProperty in ModelProperties) { + if (modelProperty.IsPrimaryKey) { + return modelProperty.Name; + } + } + return ""; } #line default @@ -207,44 +244,46 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line 41 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #line default #line hidden - #line 44 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write("\t\t\r\n\t\t\t@Html.LabelFor(model => model."); #line default #line hidden - #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 46 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); #line default #line hidden - #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 46 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write(")\r\n\t\t\r\n"); #line default #line hidden - #line 47 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 48 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + } } #line default #line hidden - #line 50 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write("\t\t\r\n\t\r\n\t\r\n"); #line default #line hidden - #line 53 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" } @@ -252,41 +291,43 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 56 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 58 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write("@foreach (var item in Model) {\r\n\t\r\n"); #line default #line hidden - #line 58 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 60 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" if (ModelHasProperties) { foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #line default #line hidden - #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write("\t\t\r\n\t\t\t@Html.DisplayFor(model => model."); #line default #line hidden - #line 63 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 66 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); #line default #line hidden - #line 63 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 66 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write(")\r\n\t\t\r\n"); #line default #line hidden - #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 68 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + } } } @@ -294,15 +335,86 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 69 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" - this.Write("\t\t\r\n\t\t\t@Html.ActionLink(\"Edit\", \"Edit\") |\r\n\t\t\t@Html.ActionLink(\"Details\", \"De" + - "tails\") |\r\n\t\t\t@Html.ActionLink(\"Delete\", \"Delete\")\r\n\t\t\r\n\t\r\n}\r\n" + - "\r\n"); + #line 73 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write("\t\t\r\n"); + + #line default + #line hidden + + #line 74 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + if (ModelHasPrimaryKey) { + + #line default + #line hidden + + #line 75 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write("\t\t\t@Html.ActionLink(\"Edit\", \"Edit\", new { id = item."); + + #line default + #line hidden + + #line 75 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 75 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(" }) |\r\n\t\t\t@Html.ActionLink(\"Details\", \"Details\", new { id = item."); + + #line default + #line hidden + + #line 76 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 76 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(" }) |\r\n\t\t\t@Html.ActionLink(\"Delete\", \"Delete\", new { id = item."); + + #line default + #line hidden + + #line 77 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); #line default #line hidden #line 77 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write(" })\r\n"); + + #line default + #line hidden + + #line 78 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + } else { + + #line default + #line hidden + + #line 79 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write("\t\t\t@Html.ActionLink(\"Edit\", \"Edit\") |\r\n\t\t\t@Html.ActionLink(\"Details\", \"Details\") " + + "|\r\n\t\t\t@Html.ActionLink(\"Delete\", \"Delete\")\r\n"); + + #line default + #line hidden + + #line 82 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + } + + #line default + #line hidden + + #line 83 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + this.Write("\t\t\r\n\t\r\n}\r\n\r\n"); + + #line default + #line hidden + + #line 87 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -313,13 +425,13 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 83 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 93 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" this.Write("\t\r\n\r\n"); #line default #line hidden - #line 85 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" + #line 95 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\List.tt" } #line default diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.tt index d595a53914..69cf769e8c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/List.tt @@ -40,11 +40,13 @@ <# foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #> @Html.LabelFor(model => model.<#= modelProperty.Name #>) <# + } } #> @@ -58,18 +60,26 @@ <# if (ModelHasProperties) { foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { #> @Html.DisplayFor(model => model.<#= modelProperty.Name #>) <# + } } } #> +<# if (ModelHasPrimaryKey) { #> + @Html.ActionLink("Edit", "Edit", new { id = item.<#= ModelPrimaryKeyName #> }) | + @Html.ActionLink("Details", "Details", new { id = item.<#= ModelPrimaryKeyName #> }) | + @Html.ActionLink("Delete", "Delete", new { id = item.<#= ModelPrimaryKeyName #> }) +<# } else { #> @Html.ActionLink("Edit", "Edit") | @Html.ActionLink("Details", "Details") | @Html.ActionLink("Delete", "Delete") +<# } #> } @@ -91,6 +101,23 @@ public class ModelProperty { public string Name { get; set; } + public bool IsPrimaryKey { get; set; } + + public ModelProperty(PropertyInfo propertyInfo) + { + this.Name = propertyInfo.Name; + this.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo); + } + + bool IsPrimaryKeyProperty(PropertyInfo propertyInfo) + { + return IsMatchIgnoringCase(propertyInfo.Name, "id"); + } + + static bool IsMatchIgnoringCase(string a, string b) + { + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + } } public string GetModelDirective() @@ -113,21 +140,41 @@ } } - bool ModelHasProperties { - get { return ModelProperties.Count > 0; } - } - public IEnumerable GetModelProperties() { var properties = new List(); foreach (PropertyInfo propertyInfo in MvcHost.GetViewDataTypeProperties()) { - properties.Add(CreateModelProperty(propertyInfo)); + properties.Add(new ModelProperty(propertyInfo)); } return properties; } - ModelProperty CreateModelProperty(PropertyInfo propertyInfo) + bool ModelHasProperties { + get { return ModelProperties.Count > 0; } + } + + bool ModelHasPrimaryKey { + get { return ModelPrimaryKeyName.Length > 0; } + } + + string modelPrimaryKeyName; + + string ModelPrimaryKeyName { + get { + if (modelPrimaryKeyName == null) { + modelPrimaryKeyName = GetModelPrimaryKeyName(); + } + return modelPrimaryKeyName; + } + } + + public string GetModelPrimaryKeyName() { - return new ModelProperty() { Name = propertyInfo.Name }; + foreach (ModelProperty modelProperty in ModelProperties) { + if (modelProperty.IsPrimaryKey) { + return modelProperty.Name; + } + } + return ""; } #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/List.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/List.tt index cc9384ec34..330fe729c6 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/List.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/List.tt @@ -40,11 +40,13 @@ <# For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey Then #> <%: Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) %> <# + End If Next #> @@ -58,18 +60,26 @@ <# If ModelHasProperties Then For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey Then #> - @Html.DisplayFor(model => model.<#= modelProperty.Name #>) + @Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>) <# + End If Next End If #> +<# If ModelHasPrimaryKey Then #> + <%: Html.ActionLink("Edit", "Edit", New With { .id = item.<#= ModelPrimaryKeyName #> }) %> | + <%: Html.ActionLink("Details", "Details", New With { .id = item.<#= ModelPrimaryKeyName #> }) %> | + <%: Html.ActionLink("Delete", "Delete", New With { .id = item.<#= ModelPrimaryKeyName #> }) %> +<# Else #> <%: Html.ActionLink("Edit", "Edit") %> | <%: Html.ActionLink("Details", "Details") %> | <%: Html.ActionLink("Delete", "Delete") %> +<# End If #> <% Next %> @@ -96,7 +106,21 @@ End Property Public Class ModelProperty - Public Property Name As String + Public Property Name() As String + Public Property IsPrimaryKey() As Boolean + + Public Sub New(ByVal propertyInfo As PropertyInfo) + Me.Name = propertyInfo.Name + Me.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo) + End Sub + + Function IsPrimaryKeyProperty(ByVal propertyInfo As PropertyInfo) As Boolean + Return IsMatchIgnoringCase(propertyInfo.Name, "id") + End Function + + Shared Function IsMatchIgnoringCase(ByVal a As String, ByVal b as String) As Boolean + Return String.Equals(a, b, StringComparison.OrdinalIgnoreCase) + End Function End Class Public Function GetViewPageType() As String @@ -109,7 +133,7 @@ Private modelPropertiesList As List(Of ModelProperty) - ReadOnly Property ModelProperties As List(Of ModelProperty) + ReadOnly Property ModelProperties() As List(Of ModelProperty) Get If modelPropertiesList Is Nothing Then modelPropertiesList = New List(Of ModelProperty)(GetModelProperties()) @@ -118,21 +142,43 @@ End Get End Property - ReadOnly Property ModelHasProperties As Integer - Get - Return ModelProperties.Count > 0 - End Get - End Property - 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)) + properties.Add(new ModelProperty(propertyInfo)) Next Return properties End Function - Function CreateModelProperty(ByVal propertyInfo As PropertyInfo) As ModelProperty - Return New ModelProperty() With { .Name = propertyInfo.Name } + ReadOnly Property ModelHasProperties As Boolean + Get + Return ModelProperties.Count > 0 + End Get + End Property + + ReadOnly Property ModelHasPrimaryKey As Boolean + Get + Return ModelPrimaryKeyName.Length > 0 + End Get + End Property + + Private modelPrimaryKeyNameValue As String + + ReadOnly Property ModelPrimaryKeyName() As String + Get + If modelPrimaryKeyNameValue Is Nothing Then + modelPrimaryKeyNameValue = GetModelPrimaryKeyName() + End If + Return modelPrimaryKeyNameValue + End Get + End Property + + Public Function GetModelPrimaryKeyName() As String + For Each modelProperty As ModelProperty in ModelProperties + If modelProperty.IsPrimaryKey Then + Return modelProperty.Name + End If + Next + Return "" End Function #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/List.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/List.tt index fa25aaa829..02c5226dbd 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/List.tt +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/List.tt @@ -41,11 +41,13 @@ End Code <# For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey Then #> @Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) <# + End If Next #> @@ -59,18 +61,26 @@ End Code <# If ModelHasProperties Then For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey then #> - @Html.DisplayFor(model => model.<#= modelProperty.Name #>) + @Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>) <# + End If Next End If #> +<# If ModelHasPrimaryKey Then #> + @Html.ActionLink("Edit", "Edit", New With { .id = item.<#= ModelPrimaryKeyName #> }) | + @Html.ActionLink("Details", "Details", New With { .id = item.<#= ModelPrimaryKeyName #> }) | + @Html.ActionLink("Delete", "Delete", New With { .id = item.<#= ModelPrimaryKeyName #> }) +<# Else #> @Html.ActionLink("Edit", "Edit") | @Html.ActionLink("Details", "Details") | @Html.ActionLink("Delete", "Delete") +<# End If #> Next @@ -92,7 +102,21 @@ Next End Property Public Class ModelProperty - Public Property Name As String + Public Property Name() As String + Public Property IsPrimaryKey() As Boolean + + Public Sub New(ByVal propertyInfo As PropertyInfo) + Me.Name = propertyInfo.Name + Me.IsPrimaryKey = IsPrimaryKeyProperty(propertyInfo) + End Sub + + Function IsPrimaryKeyProperty(ByVal propertyInfo As PropertyInfo) As Boolean + Return IsMatchIgnoringCase(propertyInfo.Name, "id") + End Function + + Shared Function IsMatchIgnoringCase(ByVal a As String, ByVal b as String) As Boolean + Return String.Equals(a, b, StringComparison.OrdinalIgnoreCase) + End Function End Class Function GetModelDirective() As String @@ -105,7 +129,7 @@ Next Private modelPropertiesList As List(Of ModelProperty) - ReadOnly Property ModelProperties As List(Of ModelProperty) + ReadOnly Property ModelProperties() As List(Of ModelProperty) Get If modelPropertiesList Is Nothing Then modelPropertiesList = New List(Of ModelProperty)(GetModelProperties()) @@ -114,21 +138,43 @@ Next End Get End Property - ReadOnly Property ModelHasProperties As Integer - Get - Return ModelProperties.Count > 0 - End Get - End Property - 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)) + properties.Add(new ModelProperty(propertyInfo)) Next Return properties End Function - Function CreateModelProperty(ByVal propertyInfo As PropertyInfo) As ModelProperty - Return New ModelProperty() With { .Name = propertyInfo.Name } + ReadOnly Property ModelHasProperties As Boolean + Get + Return ModelProperties.Count > 0 + End Get + End Property + + ReadOnly Property ModelHasPrimaryKey As Boolean + Get + Return ModelPrimaryKeyName.Length > 0 + End Get + End Property + + Private modelPrimaryKeyNameValue As String + + ReadOnly Property ModelPrimaryKeyName() As String + Get + If modelPrimaryKeyNameValue Is Nothing Then + modelPrimaryKeyNameValue = GetModelPrimaryKeyName() + End If + Return modelPrimaryKeyNameValue + End Get + End Property + + Public Function GetModelPrimaryKeyName() As String + For Each modelProperty As ModelProperty in ModelProperties + If modelProperty.IsPrimaryKey Then + Return modelProperty.Name + End If + Next + Return "" End Function #> \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpListViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpListViewTemplateTests.cs index 10ffd07f1d..79c4b05e8c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpListViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpListViewTemplateTests.cs @@ -35,6 +35,11 @@ namespace AspNet.Mvc.Tests.CodeTemplates return GetModelProperties().First(); } + AspxCSharp.List.ModelProperty GetModelProperty(string name) + { + return GetModelProperties().First(p => p.Name == name); + } + [Test] public void GetViewPageType_HostViewDataTypeNameIsMyAppMyModel_ReturnsMyAppMyModelSurroundedByAngleBrackets() { @@ -284,5 +289,114 @@ MyView "; Assert.AreEqual(expectedOutput, output); } + + [Test] + public void TransformText_ModelHasIdPropertyAndIsPartialView_UsesIdPropertyInActionLinksOnTableRow() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsPartialView = true; + Type modelType = typeof(ModelWithIdProperty); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl>"" %> + +

+ <%: Html.ActionLink(""Create"", ""Create"") %> +

+ + + + + + +<% foreach (var item in Model) { %> + + + + +<% } %> +
+ <%: Html.LabelFor(model => model.Name) %> +
+ <%: Html.DisplayFor(model => model.Name) %> + + <%: Html.ActionLink(""Edit"", ""Edit"", new { id = item.Id }) %> | + <%: Html.ActionLink(""Details"", ""Details"", new { id = item.Id }) %> | + <%: Html.ActionLink(""Delete"", ""Delete"", new { id = item.Id }) %> +
+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + AspxCSharp.List.ModelProperty modelProperty = GetModelProperty("Id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_NamePropertyIsNotMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + AspxCSharp.List.ModelProperty modelProperty = GetModelProperty("Name"); + + Assert.IsFalse(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdPropertyInLowerCase_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + AspxCSharp.List.ModelProperty modelProperty = GetModelProperty("id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasIdAndNameProperty_ReturnsId() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual("Id", primaryKeyName); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasIdPropertyInLowerCase_ReturnsLowercaseId() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual("id", primaryKeyName); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasNameProperty_ReturnsEmptyString() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual(String.Empty, primaryKeyName); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpListViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpListViewTemplateTests.cs index 2d7a71ddf7..152f9fa97e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpListViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpListViewTemplateTests.cs @@ -35,6 +35,11 @@ namespace AspNet.Mvc.Tests.CodeTemplates return GetModelProperties().First(); } + CSHtml.List.ModelProperty GetModelProperty(string name) + { + return GetModelProperties().First(p => p.Name == name); + } + [Test] public void GetModelDirective_HostViewDataTypeNameIsMyAppMyModel_ReturnsRazorModelFollowedByIEnumerableMyAppMyModel() { @@ -285,5 +290,114 @@ namespace AspNet.Mvc.Tests.CodeTemplates "; Assert.AreEqual(expectedOutput, output); } + + [Test] + public void TransformText_ModelHasIdPropertyAndIsPartialView_UsesIdPropertyInActionLinksOnTableRow() + { + CreateViewTemplatePreprocessor(); + mvcHost.IsPartialView = true; + Type modelType = typeof(ModelWithIdProperty); + mvcHost.ViewDataType = modelType; + mvcHost.ViewDataTypeName = modelType.FullName; + mvcHost.ViewName = "MyView"; + + string output = templatePreprocessor.TransformText(); + + string expectedOutput = +@"@model IEnumerable + +

+ @Html.ActionLink(""Create"", ""Create"") +

+ + + + + + +@foreach (var item in Model) { + + + + +} +
+ @Html.LabelFor(model => model.Name) +
+ @Html.DisplayFor(model => model.Name) + + @Html.ActionLink(""Edit"", ""Edit"", new { id = item.Id }) | + @Html.ActionLink(""Details"", ""Details"", new { id = item.Id }) | + @Html.ActionLink(""Delete"", ""Delete"", new { id = item.Id }) +
+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + CSHtml.List.ModelProperty modelProperty = GetModelProperty("Id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_NamePropertyIsNotMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + CSHtml.List.ModelProperty modelProperty = GetModelProperty("Name"); + + Assert.IsFalse(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdPropertyInLowerCase_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + CSHtml.List.ModelProperty modelProperty = GetModelProperty("id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasIdAndNameProperty_ReturnsId() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual("Id", primaryKeyName); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasIdPropertyInLowerCase_ReturnsLowercaseId() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual("id", primaryKeyName); + } + + [Test] + public void GetModelPrimaryKeyName_ModelHasNameProperty_ReturnsEmptyString() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithOneProperty); + + string primaryKeyName = templatePreprocessor.GetModelPrimaryKeyName(); + + Assert.AreEqual(String.Empty, primaryKeyName); + } } }