0

我有一个视图,它使用不显眼的 ajax 来提交表单,或者只是普通的 jquery ajax 也可以解决问题。对于这两种实现,我可以让它很好地击中我的控制器并执行我的 ModelState.IsValid 验证,然后返回我的视图,如下所示:

public ActionResult SubmitForm(ViewModel viewModel) 
{ 
    if(!ModelState.IsValid) 
    {
        return View("~/view path", viewModel); 
    }else 
    {
        // do stuff
        // I have to return this in order for me to get my model validation errors to show up
        return Json(new { msg = "OK" }); 
    }
}

看法:

<form asp-action="SubmitForm" asp-controller="Controller" data-ajax="true" data-ajax-method="POST"
      data-ajax-success="onSubmitSuccess(data, 'formId')" id="formId">
      
      @Html.ValidationSummary()
      // some form fields with html tag helpers
</form>

现在,当我的 SubmitForm 操作返回我对失败模型验证的看法时,我的验证摘要永远不会出现。我让它工作的唯一方法是通过检查 json msg 属性,用我返回的数据替换我的整个表单 html,就像在我的 OnSubmitSuccess 函数中一样:

function onSubmitSuccess(data, form) 
{
    if(data.msg) 
    {
        if(data.msg == "OK") { // do stuff }
    }else 
    {
        $("#" + form).html(data.responseText);
    }
}

我基本上是用传入的响应文本替换我的表单 html,以便显示我的错误消息。为什么我不能只做一个返回部分或返回视图并在不修改 jquery 和替换 html 的情况下工作,有什么特别的原因吗?

谢谢

4

1 回答 1

0

据我所知,data-ajax-success 需要包含三个参数的函数data, status, xhr,我们无法将 formid 作为参数传递给 data-ajax-success 函数。

此外,如果要将部分视图作为返回结果传递给客户端,则应直接使用数据而不是data.responseText显示视图内容值。

更多细节,你可以参考下面的测试演示和代码:

@model DotNet5Identity.Models.GetInTouch
@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>


<form asp-action="SubmitForm" asp-controller="GetInTouch" data-ajax="true" data-ajax-method="POST"
      data-ajax-success="completed" id="formId">

    <input asp-for="Id" />
    <br />
    <input asp-for="EmailAddress" />

    <input type="submit" value="Tst" />

    @Html.ValidationSummary()
    // some form fields with html tag helpers
</form>


@section scripts{

    <partial name="_ValidationScriptsPartial" />
    <script>
        completed = function (data, status, xhr) {
            alert(data.msg);

         
                if (data.msg == "OK") {

                } else {
                    $("#formId").html(data);
                }
            
        };
 

    </script>


}

控制器:

    public ActionResult SubmitForm(GetInTouch viewModel)
    {

        return PartialView("_TestPartialView");
       
            // do stuff
            // I have to return this in order for me to get my model validation errors to show up
            return Json(new { msg = "OK" });
        
    }

结果:</p>

在此处输入图像描述

于 2021-04-26T03:13:33.343 回答