【问题标题】:ASP.NET MVC form on a Partial View局部视图上的 ASP.NET MVC 表单
【发布时间】:2019-06-22 01:12:35
【问题描述】:

我有一个带有表格和按钮的页面。当我按下按钮时,部分视图会加载到 div 中。在部分视图上有一个 ajax 表单,如果表单数据错误,它会发送回带有验证错误的部分视图,但我想删除部分视图并刷新表以防插入成功。 表单标题:

@using (Ajax.BeginForm("RequestInsert", "Home", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "requestForm" }, new { id = "reqins" }))

主机页面上的 jQuery 提交事件处理程序:

$(document).on('submit', '#reqins', function (e) { 
            e.preventDefault();  
            let data = $("form :input").serializeArray();
            $.ajax({
                url: '@Url.Action("RequestInsert", "Home")'
                ,type: "POST"
                ,data: { "__RequestVerificationToken": token, "model": data }
            })
                .done(function (data) {
                    $("#requestForm").html("");
                    table.search('').columns().search('').draw();
            })
            .fail(function (jqXHR, textStatus) {
                alert("fail");
            }); 
        });

我对部分视图和 ajax 形式有点困惑。

【问题讨论】:

  • 为什么不直接使用$("#requestForm").empty(); 来删除表单呢?您目前的问题和目标是什么?
  • 谢谢,但我的主要问题是如何清空#requestForm div 并同时刷新表格。服务器端操作发回部分视图,我如何在 ajax 成功函数中确定它是否成功,我可以清空 requestForm 还是失败,我必须再次显示部分视图。
  • 这取决于您如何从控制器操作返回数据。您可以将状态响应与其他数据响应一起包含,并使用 if-condition 从那里调用 empty() 或简单地重新显示包含表单的部分视图。
  • 我返回 PartialResult 所以我必须返回一个局部视图,但我没有发回任何其他关于服务器上操作成功的标志。但也许我可以将隐藏标签放入可以包含此标志的部分视图表单中?

标签: asp.net-mvc partial-views ajax.beginform


【解决方案1】:

由于您的目标是检查 AJAX 响应的验证状态,您可以使用 if 条件来对抗 AJAX 响应,如下所示:

$('#reqins').submit(function (e) {
    e.preventDefault();

    let data = $('form :input').serializeArray();

    $.ajax({
        url: '@Url.Action("RequestInsert", "Home")',
        type: 'POST',
        data: { "__RequestVerificationToken": token, "model": data },
        success: function (result) {
            // check valid response
            if (result.invalid) {
                $('#requestForm').html(result.form);
            }
            else {
                $('#requestForm').html(result);
                table.search('').columns().search('').draw();
            }
        },
        error: function (jqXHR, textStatus) {
            alert("fail");
        }
    });
});

然后在控制器操作中,您可以使用Controller.Json()RenderViewToString() 提供的here 扩展方法返回验证状态和部分视图:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RequestInsert(ViewModel model)
{
    // perform validation here

    // assume IsValid is a boolean returned from validation status
    if (IsValid)
    {
        // successful validation, return empty form
        return PartialView("FormPartialView");
    }
    else
    {
        // validation failed, return failure status and previously-filled form
        return Json(new { invalid = true, form = RenderViewToString(PartialView("FormPartialView", model)) });
    }
}

【讨论】:

  • 我已经对此进行了一些更改,但在我看来它开始工作但它抛出了一个错误(内容安全策略:页面的设置阻止了在 self localhost:2537/favicon.ico 处加载资源(„ default-src”)),当我在表单中发送固定数据并第二次提交时。
【解决方案2】:

试试这个并删除 Ajax Helper

$('#reqins').on('click', function () { 

            let data = $("form :input").serializeArray();

            $.ajax({
                url: '@Url.Action("RequestInsert", "Home")'
                ,type: "POST"
                ,data: data 
                ,success:function (result) {
                          $("#requestForm").html(result);
                        }});

                });

修改你的动作到这个

public JsonResult RequestInsert()
        {
            try
            {
                return Json(new { success = true, result = PartialView("Prtialview") });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, result = ex.ErrorMessage });
            }
        }

然后修改客户端如下

$('#reqins').on('click', function () { 

            let data = $("form :input").serializeArray();

            $.ajax({
                url: '@Url.Action("RequestInsert", "Home")'
                ,type: "POST"
                ,data: data 
                ,success:function (result) {
                          if(result.succuss)
                          {
                             $("#requestForm").html(result);
                          }
                          else
                          {
                             alert("Error");
                           }
                        }});

                });

【讨论】:

  • 谢谢,但我的主要问题是如何清空#requestForm div 并同时刷新表格。服务器端操作发回部分视图,我如何在 ajax 成功函数中确定它是否成功,我可以清空 requestForm 还是失败,我必须再次显示部分视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多