使用局部视图加载表单,显示响应

Form loaded using partial view, show the reponse

我正在使用 ajax 加载部分视图的内容,并通过填充 div 的 html 将返回的 HTML 直接输出到页面。这是 ajax:

 $.ajax({
                    data: { productId: productId },
                    datatype: "text/plain",
                    type: "GET",
                    url: theUrl,
                    cache: false,
                    success: function (data) {
                        $("#contentArea").html(data);
                    }
                });

这一切都按预期工作。根据多种因素,部分视图中的实际 html 会有所不同,其中一种可能的情况 returns 需要一些反馈的表单。

我在这个表单上进行了客户端验证,但服务器端验证不合作。

我的验证是 FluentValidation 并且在我的控制器中有以下几行(myValidator 是我的 FluentValidation 验证器并且工作正常):

var valResult = myValidator.Validate(myRequest);
if (!valResult.IsValid) return Redirect(Request.UrlReferrer);

这一半有效,只要数据无效,IsValid 检查就会失败,但随后我的重定向只是再次重新加载页面,而没有服务器端验证消息。大概这是因为我正在使用重定向。

如果我使用 ajax 动态加载此表单,我如何让它重新加载页面但验证消息就位?

您需要将验证错误写回您的 ViewModel 并将其发送回视图本身。我是这样做的:

var mailValidator = new Models.Dokumentacija.Validation.DokumentacijaMailValidation();
var mailValidatorResult = mailValidator.Validate(vm.MailPodatki);
if (!mailValidatorResult.IsValid)
{
    ModelState.Clear();
    foreach (var error in mailValidatorResult.Errors) ModelState.AddModelError(string.Format("MailPodatki.{0}", error.PropertyName), error.ErrorMessage);
    return View(vm);
}

然后您应该 return 您的 ViewModel(现在带有错误消息),所以我认为您的重定向将不起作用。你能做一个return PartialView("_myPartial", vm);吗?