开发者

Using partial classes for validation?

I'm using Entity Framework to create my data objects. Here's what my designer.cs file looks like:

namespace MyApp.WebUI.Models
{
    ...

    [EdmEntityTypeAttribute(NamespaceName="MyAppDBModel", Name="AddressType")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    public partial class AddressType : EntityObject
    {
        ...
    }

    ...
}

I have a file called Validation.cs in which I want to keep all my validation for my entities. Here's what it looks like:

namespace MyApp.WebUI.Models
{
    public class Validations
    {
        ...

        [MetadataType(typeof(AddressTypesValidation))]
        public partial class AddressType
        {

        }

        public class AddressTypesValidation
        {
            [Required(ErrorMessage = "Address Type name is required.")]
            [StringLength(50, ErrorMessage = "Address Type name must be 50 characters 开发者_StackOverflowor less.")]
            public string Name { get; set; }                
        }
    }
}

I have this in my view page:

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm("Edit", "AddressTypes", FormMethod.Post)) { %>

    <div class="editor-label"><%: Html.LabelFor(m => m.Name) %></div>
    <div class="editor-field">
        <%: Html.TextBoxFor(m => m.Name) %>
        <%: Html.ValidationMessageFor(m => m.Name) %>
    </div>
    <input type="submit" value="Save" />

<% } %>

But my validations aren't loaded. If I try to submit the form with no value for Name, I get an error message saying The value '' is invalid. instead of my error message.

What am I doing wrong?


There is a fundamental flaw with your approach. It is generally understood that using your database objects as view models and having Mvc do its model binding on them is a very bad idea.

Darin has a great answer detailing the issues associated with using domain objects in views.

I think your issues are being caused because you're mix data objects with view models, and to quote Darin

About 60% of the question I am [Darin] answering on StackOverflow in the asp.net-mvc tag wouldn't have been asked if the OP have used a view model.


I'm not sure if you can have a partial class then have another partial class that is a nested class. Try having the partial you've declared not be a nested class.

Edit: Just ran a quick test in VS (not the validation part) and you can't one part of a partial class in a nested type and have another part of the partial class as a non-nested type (or nested in a different type).


I may be off the mark here, but I believe that the Required attribute simply means 'not null', and your StringLengthValidator is only checking for an upper bound. It's not failing because you are sending through a string - unfortunately it's the String.Empty.

You're using the overload

[StringLength(int upperBound, [Parameters])]

Instead, try

[StringLength(int lowerBound, int upperBound, [Parameters])]

something like this, if you want minimum length of 1:

[Required(ErrorMessage = "Address Type name is required.")]               
[StringLength(1, 50, ErrorMessage = "Address Type...")]
public string Name { get; set; } 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜