Всегда отображается сводка FluentValidation

Я использую форму FluentValidation, и сводка проверки, кажется, отображается во время загрузки. У меня нет ничего, что, кажется, автоматически отправляет форму, и в моем контроллере проверка проверки не выполняется до тех пор, пока форма не будет опубликована. Как ни странно, при отправке проверка работает отлично.

ViewModel:

[Validator(typeof(SendMessageInputValidator))]
public class SendMessageInput
{
    public string Title { get; set; }
    public string Content { get; set; }
    public string VideoUrl { get; set; }
    public string CultureName { get; set; }
    public bool VideoMode { get; set; }
}

public class SendMessageInputValidator : AbstractValidator<SendMessageInput>
{
    public SendMessageInputValidator()
    {
        RuleFor(s => s.Title)
            .NotEmpty().WithMessage("TitleRequired".Translate("MCN"));
    }
}

Контроллер:

    public ActionResult Detail(Guid entityId, string cultureName)
    {
        var entity = _sendMessageRepository.Get(entityId);

        if (entity == null)
            throw new HttpException(404, "Not found.");

        return View(new SendMessagePageViewModel
                        {
                            NodeId = entity.NodeId,
                            Name = entity.Name,
                            Title = entity.Title,
                            Content = entity.Content,
                            BrowserTitle = entity.BrowserTitle,
                            MetaDescription = entity.MetaDescription,
                            MetaKeywords = entity.MetaKeywords,
                            SendMessageInput = new SendMessageInput { VideoMode = true }
                        });
    }

    public ActionResult SendMessageForm(SendMessageInput input)
    {
        input.CultureName = Thread.CurrentThread.CurrentUICulture.Name;
        return PartialView(/*input*/ new SendMessageInput());
    }

    [HttpPost]
    public ActionResult SendMessage(SendMessageInput input)
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(input.CultureName);

        if (ModelState.IsValid)
        {
            return Redirect(Utilities.GetUrl(Constants.NodeIds.MyProfile));
        }

        var entity = _sendMessageRepository.Get(Constants.NodeIds.MentorQuestionForm);

        if (entity == null)
            throw new HttpException(404, "Not found.");

        return PartialView("Detail", new SendMessagePageViewModel
                                         {
                                             NodeId = entity.NodeId,
                                             Name = entity.Name,
                                             Title = entity.Title,
                                             Content = entity.Content,
                                             BrowserTitle = entity.BrowserTitle,
                                             MetaDescription = entity.MetaDescription,
                                             MetaKeywords = entity.MetaKeywords,
                                             SendMessageInput = input
                                         });
    }

Вид (основной):

 @Html.Action("SendMessageForm", "SendMessage", Model.SendMessageInput)

Просмотр (частичный):

@Html.ValidationSummary(false, "ValidationSummaryHeader".Translate("MCN"))  
@using (Html.BeginForm("SendMessage", "SendMessage", FormMethod.Post))
{
    <div class="Formulaire">
        <p>
            @Html.LabelFor(m => m.Title, "Title".Translate("MCN"), true)
            @Html.TextBoxFor(m => m.Title, new { maxlength = 200, @class = "TxtBox" })
        </p>

        @if (Model.VideoMode)
        {
            <p>
                @Html.LabelFor(m => m.VideoUrl, "VideoUrl".Translate("MCN"))
                @Html.TextBoxFor(m => m.VideoUrl)
            </p>
        }
        else
        {
            <p>
                @Html.LabelFor(m => m.Content, "Message".Translate("MCN"))
                @Html.TextAreaFor(m => m.Content, new { @class = "TxtArea" })
            </p>
        }

        @Html.HiddenFor(m => m.CultureName)

        <input type="submit" value="@("Submit".Translate("MCN"))"/>
    </div>
}

person Allov    schedule 13.04.2012    source источник


Ответы (2)


Я думаю, что когда вы впервые собираетесь отображать подробное представление, вы обновляете SendMessageInput, который, поскольку он новый, по умолчанию будет иметь пустой Title.

Когда вы затем вызываете действие SendMessageForm, вы передаете ему это новое SendMessageInput с пустым заголовком. Таким образом, во время привязки модели будет получена ошибка модели, и, следовательно, при отображении вашего частичного представления отображается ValidationSummary.

Вы пробовали использовать Html.Partial (или Html.RenderPartial) вместо Html.Action? Это приведет к отображению формы без какой-либо привязки модели.

person ngm    schedule 13.04.2012
comment
Отлично, будем пробовать! Спасибо! - person Allov; 15.04.2012
comment
Что ж, пробовали использовать Partial и RenderPartial, результат тот же. Это странно =( - person Allov; 19.04.2012
comment
Хорошо, мой плохой. В моем проекте было две формы. Тот, у которого был Html.ValidationSummer() ВНЕШНИЙ, НО с Html.Action... (это тот, на который вы смотрите). И еще один с Html.ValidationSummery() ВНУТРИ использования, но использовал Html.Partial... ТАК... в заключение, вы должны получить Html.ValidationSummary() ВНЕШНИЕ использование И использовать Html.Partial . Спасибо за Ваш ответ! - person Allov; 19.04.2012

Даже если ответ ngm является частью ответа, я не смог заставить его работать.

Итак, для тех, кто будет читать это в будущем, вот как я заставил это работать:

  • @Html.ValidationSummary() должен быть в операторе @using, иначе он просто не покажет сводку проверки.
  • Использование @Html.Partial или @Html.RenderPartial считается хорошей практикой, но не помешает отобразить сводку.
  • Я решил свою проблему, используя CSS. Сводка проверки сначала отображается с классом validation-summary-valid, и я применил к нему display:none. При наличии ошибок класс изменяется на validation-summary-errors.

Вот оно, и оно даже не связано с FluentValidation, просто так работает расширение Html.

person Allov    schedule 23.04.2012