From bd9fc100fcce4212dc93cd06d9713a0aec129938 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 30 Nov 2011 19:38:52 +0000 Subject: [PATCH] Treat Id model property as primary key in ASP.NET MVC Details T4 template. --- .../AddView/AspxCSharp/Details.cs | 143 +++++++++++++++--- .../AddView/AspxCSharp/Details.tt | 72 ++++++++- .../CodeTemplates/AddView/CSHTML/Details.cs | 135 ++++++++++++++--- .../CodeTemplates/AddView/CSHTML/Details.tt | 68 ++++++++- .../AddView/AspxVisualBasic/Details.tt | 69 ++++++++- .../CodeTemplates/AddView/VBHTML/Details.tt | 69 ++++++++- .../AspxCSharpDetailsViewTemplateTests.cs | 104 +++++++++++++ .../RazorCSharpDetailsViewTemplateTests.cs | 105 +++++++++++++ 8 files changed, 703 insertions(+), 62 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 10b0b699f8..6d3f0a9bdf 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 @@ -20,7 +20,7 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 62 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 72 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.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() @@ -40,18 +57,49 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { return String.Empty; } + List modelProperties; + + List ModelProperties { + get { + if (modelProperties == null) { + modelProperties = new List(GetModelProperties()); + } + return modelProperties; + } + } + 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 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 @@ -222,56 +270,109 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line hidden #line 34 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" - foreach (ModelProperty modelProperty in GetModelProperties()) { + + foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { + #line default #line hidden - #line 35 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 38 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\t\r\n\t
\r\n\t\t<%: Html.LabelFor(model => model."); #line default #line hidden - #line 37 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name)); + #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name )); #line default #line hidden - #line 37 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(") %>\r\n\t
\r\n\t
\r\n\t\t<%: Html.DisplayFor(model => model" + "."); #line default #line hidden - #line 40 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( modelProperty.Name)); + #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.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\AspxCSharp\Details.tt" + #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write(") %>\r\n\t
\r\n"); #line default #line hidden - #line 42 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 45 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + + } + } + + + #line default + #line hidden + + #line 49 "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 51 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + if (ModelHasPrimaryKey) { + + #line default + #line hidden + + #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\t<%: Html.ActionLink(\"Edit\", \"Edit\", new { id = Model."); + + #line default + #line hidden + + #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write(" }) %> |\r\n"); + + #line default + #line hidden + + #line 53 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + } else { + + #line default + #line hidden + + #line 54 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\t<%: Html.ActionLink(\"Edit\", \"Edit\") %> |\r\n"); + + #line default + #line hidden + + #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" } #line default #line hidden - #line 43 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\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 56 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + this.Write("\t<%: Html.ActionLink(\"Back\", \"Index\") %>\r\n

\r\n"); #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 58 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -282,13 +383,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\Details.tt" + #line 64 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" this.Write("\r\n"); #line default #line hidden - #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 65 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" } else { PopIndent(); @@ -297,13 +398,13 @@ namespace ICSharpCode.AspNet.Mvc.AspxCSharp { #line default #line hidden - #line 59 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 69 "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 61 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Details.tt" + #line 71 "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 6ffc8596b0..0293b32d14 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 @@ -31,18 +31,28 @@ #>
<#= MvcHost.ViewDataType.Name #> -<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> +<# + foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { +#>
- <%: Html.LabelFor(model => model.<#= modelProperty.Name#>) %> + <%: Html.LabelFor(model => model.<#= modelProperty.Name #>) %>
- <%: Html.DisplayFor(model => model.<#= modelProperty.Name#>) %> + <%: Html.DisplayFor(model => model.<#= modelProperty.Name #>) %>
-<# } #> +<# + } + } +#>

+<# if (ModelHasPrimaryKey) { #> + <%: Html.ActionLink("Edit", "Edit", new { id = Model.<#= ModelPrimaryKeyName #> }) %> | +<# } else { #> <%: Html.ActionLink("Edit", "Edit") %> | +<# } #> <%: Html.ActionLink("Back", "Index") %>

<# @@ -67,6 +77,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() @@ -78,17 +105,48 @@ return String.Empty; } + List modelProperties; + + List ModelProperties { + get { + if (modelProperties == null) { + modelProperties = new List(GetModelProperties()); + } + return modelProperties; + } + } + 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 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/Details.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Details.cs index d2bb491283..f2d43f5624 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 @@ -20,7 +20,7 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { private global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost hostValue; - #line 58 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 68 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.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() @@ -40,18 +57,49 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { return String.Empty; } + List modelProperties; + + List ModelProperties { + get { + if (modelProperties == null) { + modelProperties = new List(GetModelProperties()); + } + return modelProperties; + } + } + 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 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 @@ -188,55 +236,108 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #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()) { + + foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { + #line default #line hidden - #line 36 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 39 "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" + #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 38 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #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\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" + #line 44 "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" + #line 44 "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 46 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + + } + } + + + #line default + #line hidden + + #line 50 "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 52 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + if (ModelHasPrimaryKey) { + + #line default + #line hidden + + #line 53 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\t@Html.ActionLink(\"Edit\", \"Edit\", new { id = Model."); + + #line default + #line hidden + + #line 53 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( ModelPrimaryKeyName )); + + #line default + #line hidden + + #line 53 "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 54 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + } else { + + #line default + #line hidden + + #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\t@Html.ActionLink(\"Edit\", \"Edit\") |\r\n"); + + #line default + #line hidden + + #line 56 "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 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + this.Write("\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" + #line 59 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" if (MvcHost.IsPartialView) { // Do nothing. @@ -247,13 +348,13 @@ namespace ICSharpCode.AspNet.Mvc.CSHtml { #line default #line hidden - #line 55 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 65 "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 57 "D:\projects\dotnet\SharpDevelop.AspNetMvc\src\AddIns\BackendBindings\AspNet.Mvc\Project\ItemTemplates\CSharp\CodeTemplates\AddView\CSHTML\Details.tt" + #line 67 "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 f569de2218..5e9d4c68b6 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 @@ -32,7 +32,10 @@ #>
<#= MvcHost.ViewDataType.Name #> -<# foreach (ModelProperty modelProperty in GetModelProperties()) { #> +<# + foreach (ModelProperty modelProperty in ModelProperties) { + if (!modelProperty.IsPrimaryKey) { +#>
@Html.LabelFor(model => model.<#= modelProperty.Name #>) @@ -40,10 +43,17 @@
@Html.DisplayFor(model => model.<#= modelProperty.Name #>)
-<# } #> +<# + } + } +#>

+<# if (ModelHasPrimaryKey) { #> + @Html.ActionLink("Edit", "Edit", new { id = Model.<#= ModelPrimaryKeyName #> }) | +<# } else { #> @Html.ActionLink("Edit", "Edit") | +<# } #> @Html.ActionLink("Back", "Index")

<# @@ -63,6 +73,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() @@ -74,17 +101,48 @@ return String.Empty; } + List modelProperties; + + List ModelProperties { + get { + if (modelProperties == null) { + modelProperties = new List(GetModelProperties()); + } + return modelProperties; + } + } + 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 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/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Details.tt index 1ac68a8ae9..b8bd64da31 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 @@ -32,7 +32,10 @@ #>
<#= MvcHost.ViewDataType.Name #> -<# For Each modelProperty As ModelProperty in GetModelProperties() #> +<# + For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey Then +#>
<%: Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) %> @@ -40,10 +43,17 @@
<%: Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>) %>
-<# Next #> +<# + End If + Next +#>

+<# If ModelHasPrimaryKey Then #> + <%: Html.ActionLink("Edit", "Edit", New With { .id = Model.<#= ModelPrimaryKeyName #> }) %> | +<# Else #> <%: Html.ActionLink("Edit", "Edit") %> | +<# End If #> <%: Html.ActionLink("Back", "Index") %>

<# @@ -68,7 +78,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 @@ -79,15 +103,48 @@ Return String.Empty End Function + Private modelPropertiesList As List(Of ModelProperty) + + ReadOnly Property ModelProperties() As List(Of ModelProperty) + Get + If modelPropertiesList Is Nothing Then + modelPropertiesList = New List(Of ModelProperty)(GetModelProperties()) + End If + Return modelPropertiesList + 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 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/Details.tt b/src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Details.tt index a5cb2f23b6..e1ef1f6fb1 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 @@ -33,7 +33,10 @@ End Code #>
<#= MvcHost.ViewDataType.Name #> -<# For Each modelProperty As ModelProperty in GetModelProperties() #> +<# + For Each modelProperty As ModelProperty in ModelProperties + If Not modelProperty.IsPrimaryKey Then +#>
@Html.LabelFor(Function(model) model.<#= modelProperty.Name #>) @@ -41,10 +44,17 @@ End Code
@Html.DisplayFor(Function(model) model.<#= modelProperty.Name #>)
-<# Next #> +<# + End If + Next +#>

+<# If ModelHasPrimaryKey Then #> + @Html.ActionLink("Edit", "Edit", New With { .id = Model.<#= ModelPrimaryKeyName #> }) %> | +<# Else #> @Html.ActionLink("Edit", "Edit") | +<# End If #> @Html.ActionLink("Back", "Index")

<# @@ -64,7 +74,21 @@ End Code 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 @@ -75,15 +99,48 @@ End Code Return String.Empty End Function + Private modelPropertiesList As List(Of ModelProperty) + + ReadOnly Property ModelProperties() As List(Of ModelProperty) + Get + If modelPropertiesList Is Nothing Then + modelPropertiesList = New List(Of ModelProperty)(GetModelProperties()) + End If + Return modelPropertiesList + 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 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/AspxCSharpDetailsViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs index fc231ba42c..393cf4fe6e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/AspxCSharpDetailsViewTemplateTests.cs @@ -35,6 +35,11 @@ namespace AspNet.Mvc.Tests.CodeTemplates return GetModelProperties().First(); } + Details.ModelProperty GetModelProperty(string name) + { + return GetModelProperties().First(p => p.Name == name); + } + [Test] public void GetViewPageType_HostViewDataTypeNameIsMyAppMyModel_ReturnsMyAppMyModelSurroundedByAngleBrackets() { @@ -244,5 +249,104 @@ MyView "; Assert.AreEqual(expectedOutput, output); } + + [Test] + public void TransformText_ModelHasIdProperty_EditActionLinkUsesModelIdProperty() + { + 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"" %> + +
+ ModelWithIdProperty + +
+ <%: Html.LabelFor(model => model.Name) %> +
+
+ <%: Html.DisplayFor(model => model.Name) %> +
+
+

+ <%: Html.ActionLink(""Edit"", ""Edit"", new { id = Model.Id }) %> | + <%: Html.ActionLink(""Back"", ""Index"") %> +

+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + Details.ModelProperty modelProperty = GetModelProperty("Id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_NamePropertyIsNotMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + Details.ModelProperty modelProperty = GetModelProperty("Name"); + + Assert.IsFalse(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdPropertyInLowerCase_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + Details.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/RazorCSharpDetailsViewTemplateTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs index 14ef572034..54a2f4c510 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/CodeTemplates/RazorCSharpDetailsViewTemplateTests.cs @@ -35,6 +35,11 @@ namespace AspNet.Mvc.Tests.CodeTemplates return GetModelProperties().First(); } + Details.ModelProperty GetModelProperty(string name) + { + return GetModelProperties().First(p => p.Name == name); + } + [Test] public void GetModelDirective_HostViewDataTypeNameIsMyAppMyModel_ReturnsRazorModelFollowedByMyAppMyModel() { @@ -205,6 +210,7 @@ namespace AspNet.Mvc.Tests.CodeTemplates "; Assert.AreEqual(expectedOutput, output); } + [Test] public void TransformText_ModelHasTwoPropertiesAndIsPartialView_ReturnsControlWithHtmlHelperForModelProperties() { @@ -244,5 +250,104 @@ namespace AspNet.Mvc.Tests.CodeTemplates "; Assert.AreEqual(expectedOutput, output); } + + [Test] + public void TransformText_ModelHasIdPropertyAndIsPartialView_IdPropertyIsMarkedAsPrimaryKey() + { + 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 AspNet.Mvc.Tests.CodeTemplates.Models.ModelWithIdProperty + +
+ ModelWithIdProperty + +
+ @Html.LabelFor(model => model.Name) +
+
+ @Html.DisplayFor(model => model.Name) +
+
+

+ @Html.ActionLink(""Edit"", ""Edit"", new { id = Model.Id }) | + @Html.ActionLink(""Back"", ""Index"") +

+"; + Assert.AreEqual(expectedOutput, output); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + Details.ModelProperty modelProperty = GetModelProperty("Id"); + + Assert.IsTrue(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdAndNameProperty_NamePropertyIsNotMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdProperty); + + Details.ModelProperty modelProperty = GetModelProperty("Name"); + + Assert.IsFalse(modelProperty.IsPrimaryKey); + } + + [Test] + public void GetModelProperties_ModelHasIdPropertyInLowerCase_IdPropertyIsMarkedAsPrimaryKey() + { + CreateViewTemplatePreprocessor(); + mvcHost.ViewDataType = typeof(ModelWithIdPropertyInLowerCase); + + Details.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); + } } }