Как отобразить ошибки в представлении из результатов fluentvalidation в приложении asp.net mvc 2? - PullRequest
0 голосов
/ 20 июля 2010

Я изучаю asp.net MVC 2 и свободно проверяю. Моя настройка показана после текста здесь. Моя проблема в том, что я не знаю, как правильно установить ошибки, содержащиеся в объекте res на странице просмотра. Как это должно быть сделано? Как сейчас, в представлении не отображаются ошибки, но проверка работает достаточно хорошо. Я подозреваю, что я должен вставить какой-то код, где я написал "// Установить ошибки при просмотре" в коде. Но какой код мне нужно поставить? Я не смог найти четких ответов на этот вопрос - может быть, я просто слепой. Я с нетерпением жду вашей помощи. Спасибо.

Мой контроллер:

public class AccountController
{
    public ActionResult LogOn()
    {
        return View();
    }

    [HttpPost]
    public ActionResult LogOn(LogOnModel1 model, string returnUrl)
    {
        public class LogOnModel1
        {
            public string UserName { get; set; }
            public string Password { get; set; }
            public bool RememberMe { get; set; }
        }

        public class AccountValidator : AbstractValidator<LogOnModel1>
        {
            public AccountValidator()
            {
                RuleFor(x => x.UserName).NotNull().WithMessage("Brugernavn skal udfyldes").NotEmpty().WithMessage("Brugernavn skal udfyldes");
                RuleFor(x => x.Password).NotNull().WithMessage("Kodeord skal udfyldes").NotEmpty().WithMessage("Kodeord skal udfyldes");
                Custom(x => { return Membership.Provider.ValidateUser(x.UserName,x.Password) ? new ValidationFailure(null, "wrong password") : null; });
            }
        }

        FluentValidation.Results.ValidationResult res = new Models.AccountValidator().Validate(model);
        if (res.IsValid)
        {
            FormsService.SignIn(model.UserName, model.RememberMe);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            // Set errors on view
        }
        return View(model);
    }
}

Моя модель и класс проверки:

public class LogOnModel1
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

public class AccountValidator : AbstractValidator<LogOnModel1>
{
    public AccountValidator()
    {
        RuleFor(x => x.UserName).NotNull().WithMessage("Brugernavn skal udfyldes").NotEmpty().WithMessage("Brugernavn skal udfyldes");
        RuleFor(x => x.Password).NotNull().WithMessage("Kodeord skal udfyldes").NotEmpty().WithMessage("Kodeord skal udfyldes");
        Custom(x => { return Membership.Provider.ValidateUser(x.UserName,x.Password) ? new ValidationFailure(null, "wrong password") : null; });
    }
}

и наконец мой взгляд:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TelCountMVC.Models.LogOnModel1>" %>

<asp:Content ID="loginTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Log On
</asp:Content>

<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Log On</h2>
    <p>
        Please enter your username and password. <%: Html.ActionLink("Register", "Register") %> if you don't have an account.
    </p>

    <% using (Html.BeginForm()) { %>
        <%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %>
        <div>
            <fieldset>
                <legend>Account Information</legend>
                <div class="editor-label">
                    <%: Html.LabelFor(m => m.UserName) %>
                </div>
                <div class="editor-field">
                    <%: Html.TextBoxFor(m => m.UserName) %>
                    <%: Html.ValidationMessageFor(m => m.UserName) %>
                </div>
                <div class="editor-label">
                    <%: Html.LabelFor(m => m.Password) %>
                </div>
                <div class="editor-field">
                    <%: Html.PasswordFor(m => m.Password) %>
                    <%: Html.ValidationMessageFor(m => m.Password) %>
                </div>
                <div class="editor-label">
                    <%: Html.CheckBoxFor(m => m.RememberMe) %>
                    <%: Html.LabelFor(m => m.RememberMe) %>
                </div>
                <p>
                    <input type="submit" value="Log On" />
                </p>
            </fieldset>
        </div>
    <% } %>
</asp:Content>

1 Ответ

0 голосов
/ 19 августа 2010

Я подозреваю, что вы выяснили это давным-давно.

Вы теряете состояние модели, если вызываете RedirectToAction.Вы должны вернуть представление и передать в него модель LogOnModel1.

Подключите представление к вашей модели вместо System.Web.Mvc.ViewPage, а затем в вашем контроллере сделайте что-то вроде этого:

if(! ModelState.IsValid) {
     return View("Index", logOnModel1);
}

И здесь - это ссылка на описание Джереми Скиннера (создателя Fluent Validation) о том, как настроить его с помощью MVC 2.

...