Search code examples
c#asp.net-mvc-3unobtrusive-validationfluentvalidation

Validation message contain '{PropertyName}' instead of name of property


I use fluent validation with client side unobtrusive validation.

 <fieldset class="edit-root-form">
    <p>
        @Html.LabelFor(model => model.Login, UserRes.Login)
        @Html.TextBoxFor(model => model.Login)
        @Html.ValidationMessageFor(model => model.Login)
    </p>         
</fieldset>

Fluent validation rule:

 this.RuleFor(x => x.Login).NotNull().EmailAddress()

And I got error message like this: '{PropertyName}' must not be empty.

Genered html:

<input data-val="true" data-val-regex="&amp;#39;{PropertyName}&amp;#39; is not a valid
email address."  data-val-required="&amp;#39;{PropertyName}&amp;#39; must not be
 empty." id="Login" name="Login" type="text" value="" class="input-validation-error">

Why MVC don`t replace PropertyName real field name?


Solution

  • Works fine for me. I am using the latest FluentValidation version (2.0.0.0) and ASP.NET MVC 3 RTM.

    Model and validator:

    [Validator(typeof(MyViewModelValidator))]
    public class MyViewModel
    {
        public string Login { get; set; }
    }
    
    public class MyViewModelValidator : AbstractValidator<MyViewModel>
    {
        public MyViewModelValidator()
        {
            RuleFor(x => x.Login).NotNull().EmailAddress();
        }
    }
    

    Controller:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new MyViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return View(model);
        }
    }
    

    View:

    @model AppName.Models.MyViewModel
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    @using (Html.BeginForm())
    {
        @Html.LabelFor(model => model.Login, "Login")
        @Html.TextBoxFor(model => model.Login)
        @Html.ValidationMessageFor(model => model.Login)
        <input type="submit" value="OK" />
    }
    

    Application_Start in Global.asax:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));
    }
    

    Two cases:

    1. Leave the textbox empty: 'Login' must not be empty. validation error message is shown.
    2. Type an invalid email: 'Login' is not a valid email address. validation error message is shown.

    And finally here's the generated HTML for the textbox:

    <input data-val="true" data-val-regex="&amp;#39;Login&amp;#39; is not a valid email address." data-val-regex-pattern="^(?:[\w\!\#\$\%\&amp;\&#39;\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&amp;\&#39;\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$" data-val-required="&amp;#39;Login&amp;#39; must not be empty." id="Login" name="Login" type="text" value="" />