I'm currently working through Getting Started with EF5 using MVC 4 in Visual Studio 2010 (.NET 4.0) to learn about how to use ASP.NET and Entity Framework. During the beginning of the tutorial I ran into an issue with enum support when creating a database with Code First Migrations. For reasons unknown I have to work in this environment and create my own support for enums so I decided to make the property int
instead then I would convert it to Enum when I want to display it like so:
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Linq;
using System.Linq.Expressions;
namespace ContosoUniversity.Extensions
{
public static class Extensions
{
public static String DisplayAsEnum<TModel, TValue>(this HtmlHelper<TModel> cHtml,
Expression<Func<TModel, TValue>> cExpression,
Type cType,
String strDisplay = "Unknown")
{
try
{
if (cType.IsEnum)
{
object cResult = cExpression.Compile().DynamicInvoke(cHtml.ViewData.Model);
if (cResult != null)
{
strDisplay = Enum.ToObject(cType, cResult).ToString();
}
}
}
catch (Exception cExc)
{
strDisplay = cExc.ToString();
}
return (strDisplay);
}
}
}
In my razor cshtml file I display it to the webpage with this call:
@Html.DisplayAsEnum(modelItem => item.Grade, typeof(Grade), "No Grade")
I have a feeling that this is not the "professional" or "right" way of handling the lack of enum support so I was wondering if there is anyway to improve this function or is there a better way of handling enumerations in EF 5 with .Net 4.0 support?
I was shown a Stack Overflow question that provides me with a better solution to handling the enum support. It is very helpful and I am using it at the moment, but since I do like the function that I made, is it possible to improve it?
-
\$\begingroup\$ This StackOverflow question should be right up your alley. In my opinion the accepted answer is a cleaner solution. \$\endgroup\$Greg Burghardt– Greg Burghardt2014年10月06日 17:16:22 +00:00Commented Oct 6, 2014 at 17:16
-
\$\begingroup\$ @GregBurghardt It looks like I should of paid more attention to StackOverflow before posting my question lol. That did work for me, and without needed to re-update the database. Thanks! \$\endgroup\$John Odom– John Odom2014年10月06日 18:43:08 +00:00Commented Oct 6, 2014 at 18:43
1 Answer 1
Ideally you won't want to change the strDisplay
, so we should probably take it out of the parameter list and make it a constant inside the method and then just return in each of the 3 circumstances.
var display = "Unknown";
try
{
if (cType.IsEnum)
{
object cResult = cExpression.Compile().DynamicInvoke(cHtml.ViewData.Model);
if (cResult != null)
{
return Enum.ToObject(cType, cResult).ToString();
}
}
}
catch (Exception cExc)
{
return cExc.ToString();
}
return display;
this seems weird to me that we are using the variable (whatever you choose to name it) only once, I would probably in this circumstance (since we aren't allowing it to be changed) just return the string Unknown
like this
try
{
if (cType.IsEnum)
{
object cResult = cExpression.Compile().DynamicInvoke(cHtml.ViewData.Model);
if (cResult != null)
{
return Enum.ToObject(cType, cResult).ToString();
}
}
}
catch (Exception cExc)
{
return cExc.ToString();
}
return "Unknown";
-
1\$\begingroup\$ I don't know why the other answer got deleted but I do like this answer. It does make sense to me to not change
strDisplay
. I don't know what I was thinking at the time lol. Thanks for the answer! \$\endgroup\$John Odom– John Odom2015年04月17日 19:12:21 +00:00Commented Apr 17, 2015 at 19:12