Ik ben bezig met een privé applicatie, voor mijzelf waarbij ik ASP.NET MVC 2 gebruik in combinatie met het Entities Framework en .NET 3.5. Het leuke van het entities framework is dat het makkelijk en snel te gebruiken is. Dat geldt eveneens voor MVC met z'n strong typed HTML helpers.
Nu heb ik voor een registratiepagina een viewmodel gemaakt, die onder andere een User bevat. Op deze manier zou je een bijbehorende tekstbox ervoor moeten krijgen:
Dat werkt dus in theorie, maar in de praktijk blijk het anders uit te pakken. Iedere HTML helper die ik op die manier gebruik gooit ergens in de method chain een CustomAttributeFormatException op.
Omdat ik de standaard designer in Visual Studio gebruik voor het genereren van de classes die bij het datamodel horen, gebruik ik de MetadataType attribuut om het validatieclass voor mijn User class kenbaar te maken:
Nu wordt deze exception opgegooid:
Ik heb al bepaald
De gegenereerde entity class zorgt voor problemen
Als ik een nieuwe instantie van de UserValidation class aanmaak en als volgt injecteer in de Textbox gaat het goed:
Er is geen exception.
De gegenereerde code van het Entity Framework:
Ik wilde eigenlijk nog gaan proberen om xVal te gebruiken, maar dat lost het probleem niet op omdat het op een heel ander niveau ligt. Dit lijkt gewoon met de HTML helper te maken te hebben.
Uiteraard heb ik ook op Google gezocht maar er is niemand die iets relevants heeft gehad blijkbaar. Ik of mijn code moet bijna wel de fout zijn. MVC2 mag dan wel jong zijn maar is uitgebreid getest, dus dit zal dan aan het licht zijn gekomen.
Is er toevallig iemand met suggesties of ervaring?
Nu heb ik voor een registratiepagina een viewmodel gemaakt, die onder andere een User bevat. Op deze manier zou je een bijbehorende tekstbox ervoor moeten krijgen:
C#:
1
| Html.TextBoxFor(model => model.User.Username) |
Dat werkt dus in theorie, maar in de praktijk blijk het anders uit te pakken. Iedere HTML helper die ik op die manier gebruik gooit ergens in de method chain een CustomAttributeFormatException op.
Omdat ik de standaard designer in Visual Studio gebruik voor het genereren van de classes die bij het datamodel horen, gebruik ik de MetadataType attribuut om het validatieclass voor mijn User class kenbaar te maken:
C#:
1
2
| [MetadataType(typeof(UserValidation))] public partial class User { ... } |
Nu wordt deze exception opgegooid:
[small]System.Reflection.CustomAttributeFormatException was unhandled by user code Message=De opgegeven eigenschap ErrorMessage is niet gevonden. Source=mscorlib StackTrace: bij System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes) bij System.Reflection.CustomAttribute.GetCustomAttributes(RuntimePropertyInfo property, RuntimeType caType) bij System.Reflection.RuntimePropertyInfo.GetCustomAttributes(Type attributeType, Boolean inherit) bij System.Attribute.InternalGetCustomAttributes(PropertyInfo element, Type type, Boolean inherit) bij System.Attribute.GetCustomAttributes(MemberInfo element, Boolean inherit) bij System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptor.TypeDescriptorCache.GetAssociatedMetadata(Type type, String memberName) bij System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptor.GetPropertiesWithMetadata(PropertyDescriptorCollection originalCollection) bij System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptor.GetProperties() bij System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor, Type containerType, String propertyName) bij System.Web.Mvc.ModelMetadata.GetMetadataFromProvider(Func`1 modelAccessor, Type modelType, String propertyName, Type containerType) bij System.Web.Mvc.ModelMetadata.FromLambdaExpression[TParameter,TValue](Expression`1 expression, ViewDataDictionary`1 viewData) bij System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor[TModel,TProperty](HtmlHelper`1 htmlHelper, Expression`1 expression, String validationMessage, IDictionary`2 htmlAttributes) bij System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor[TModel,TProperty](HtmlHelper`1 htmlHelper, Expression`1 expression) bij ASP.views_account_register_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in m:\Developing\Visual Studio\Projects\DevDammann.nl\DevDammann.nl\Views\Account\Register.aspx:regel 23 bij System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) bij System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) bij System.Web.UI.Control.Render(HtmlTextWriter writer) bij System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer) bij ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in m:\Developing\Visual Studio\Projects\DevDammann.nl\DevDammann.nl\Views\Shared\Site.Master:regel 47 bij System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) bij System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) bij System.Web.UI.Control.Render(HtmlTextWriter writer) bij System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer) bij System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) bij System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) bij System.Web.UI.Page.Render(HtmlTextWriter writer) bij System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) bij System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) bij System.Web.UI.Control.RenderControl(HtmlTextWriter writer) bij System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) InnerException: System.Reflection.TargetInvocationException Message=Het doel van een aanroep heeft een uitzondering veroorzaakt. Source=mscorlib StackTrace: bij System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) bij System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) bij System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes) InnerException: System.InvalidOperationException Message=Deze eigenschap kan niet worden ingesteld omdat het kenmerk zich in de modus voor bronfoutberichten bevindt. Source=System.ComponentModel.DataAnnotations StackTrace: bij System.ComponentModel.DataAnnotations.ValidationAttribute.set_ErrorMessage(String value) InnerException: [/small]
Ik heb al bepaald
- De htmlhelpers kan om één of andere reden niet met mijn viewmodel omgaan
Door simpelweg de User als een lokale variabele te refereren is dit uitgesloten. - De attributen in de metadataclass zorgen voor problemen
Door deze te commenten is dit uitgesloten. - Username is null zorgt voor problemen
Door de username op een random string te zetten is dit uitgesloten.
De gegenereerde entity class zorgt voor problemen
Als ik een nieuwe instantie van de UserValidation class aanmaak en als volgt injecteer in de Textbox gaat het goed:
C#:
1
2
| var u = new UserValidation() {Username = String.Empty}; Html.TextBoxFor(model => u.Username) |
Er is geen exception.
De gegenereerde code van het Entity Framework:
C#:
1
2
3
| [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)] [global::System.Runtime.Serialization.DataMemberAttribute()] [global::System.CodeDom.Compiler.GeneratedCode("System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")] |
Ik wilde eigenlijk nog gaan proberen om xVal te gebruiken, maar dat lost het probleem niet op omdat het op een heel ander niveau ligt. Dit lijkt gewoon met de HTML helper te maken te hebben.
Uiteraard heb ik ook op Google gezocht maar er is niemand die iets relevants heeft gehad blijkbaar. Ik of mijn code moet bijna wel de fout zijn. MVC2 mag dan wel jong zijn maar is uitgebreid getest, dus dit zal dan aan het licht zijn gekomen.
Is er toevallig iemand met suggesties of ervaring?
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]