1

我正在使用 FluentValidation 表单,并且验证摘要似乎在加载时显示。我没有任何似乎可以自动提交表单的东西,并且在我的控制器中,在发布表单之前不会进行验证检查。很奇怪,提交时验证似乎工作得很好。

视图模型:

[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>
}
4

2 回答 2

2

我认为,当您第一次要显示 Detail 视图时,您正在更新 a SendMessageInput,因为它是新的Title,默认情况下将有一个空的。

然后,当您调用该SendMessageForm操作时,您将SendMessageInput使用空标题传递给它这个新的。因此,在模型绑定期间,它会出现模型错误,因此当您的局部视图被渲染时,ValidationSummary 会显示。

您是否尝试过使用Html.Partial(或Html.RenderPartial) 而不是Html.Action?这将呈现表单而不发生任何模型绑定。

于 2012-04-13T22:55:23.580 回答
0

即使 ngm 的答案是答案的一部分,我也无法让它发挥作用。

因此,对于将来阅读本文的任何人,我都是这样做的:

  • @Html.ValidationSummary()必须在@using语句中,否则它只是不显示验证摘要。
  • 使用@Html.Partialor@Html.RenderPartial被认为是一种很好的做法,但不会阻止显示摘要。
  • 虽然使用 CSS,但我确实解决了我的问题。验证摘要首先使用一个类呈现,validation-summary-valid然后我display:none对其应用了一个。一旦出现错误,类将更改为validation-summary-errors.

在那里,你有它,它甚至与 FluentValidation 无关,它只是 Html 扩展的工作方式。

于 2012-04-23T13:41:32.070 回答