【问题标题】:Multiple Submit Buttons in Razor Pages not able to find handler pageName?handler=OnPostUploadImageRazor 页面中的多个提交按钮无法找到处理程序 pageName?handler=OnPostUploadImage
【发布时间】:2020-04-15 07:18:52
【问题描述】:

我正在尝试在 asp.net 核心 Razor 页面中使用 Ajax 方法上传图像,我是主要表单,所有输入字段都将保留,并且使用 Fileupload 表单我还添加了添加按钮,该按钮用于使用 Ajax 上传文件, 当我点击

<input type="submit" value="Upload Image" asp-page-handler="OnPostUploadImage" id="btnUploadImage" />

我希望它在 pageModel 文件中调用 OnPostUploadImage 方法,但它总是使用默认的 OnPost 方法。当我将OnPost 重命名为OnPost2 时,什么也没发生..

我如何在按钮btnUploadImage 点击事件上调用OnPostUploadImage()

当我点击 btnUploadImage 时,它会在浏览器控制台上生成以下错误

FF 中的错误

XML 解析错误:找不到根元素位置: https://localhost:44364/Admin/News/NewsCreate?handler=OnPostUploadImage 第 1 行,第 1 列:

Chrome 中的错误

jquery.min.js:2 POST https://localhost:44364/Admin/News/NewsCreateMultipleSubmit?handler=OnPostUpLoadImage 400(错误请求)

事件虽然路径看起来不错,但根据错误消息找不到它

 @page
    @model BookListRazor.Pages.Admin.News.NewsCreateModel
    @{
        ViewData["Title"] = "News Create";
        Layout = "~/Pages/Shared/_LayoutAdmin.cshtml";
    }


     <div class="border container" style="padding:30px;">
            <form method="post" enctype="multipart/form-data">
                <div class="text-danger" asp-validation-summary="ModelOnly"></div>
                <input hidden asp-for="News.NewsImage" />
                <input id="fileName" hidden value="" />

                <div class="form-group row">
                    <div class="col-2">
                        <label asp-for="News.NewsHeading"></label>
                    </div>
                    <div class="col-10">
                        <input asp-for="News.NewsHeading" class="form-control" />

                    </div>
                    <span asp-validation-for="News.NewsHeading" class="text-danger"></span>
                </div>


                <div class="form-group row">
                    <div class="col-2">
                        <label asp-for="News.NewsImage"></label>
                    </div>
                    <div class="col-10">
                        @*<input asp-for="News.NewsImage" type="file" class="form-control" id="NewsImage">*@
                        @*Photo property type is IFormFile, so ASP.NET Core automatically creates a FileUpload control  *@
                        <div class="custom-file">
                            <input asp-for="NewsImageForUpload" class="custom-file-input form-control">
                            <label class="custom-file-label">Click here to change photo</label>
                                                <input type="submit" value="Upload Image" asp-page-handler="OnPostUploadImage" id="btnUploadImage" />

                        </div>
                    </div>
                    <span id="imageStatus" class="text-danger"></span>
                    <span asp-validation-for="NewsImageForUpload" class="text-danger"></span>
                </div>


                <div class="form-group row">
                    <div class="col-3 offset-3">
                        <input id="btnSave" type="submit" value="Create" class="btn btn-primary form-control" />
                    </div>
                    <div class="col-3">
                        <a asp-page="Index" class="btn btn-success form-control">Back to List</a>
                    </div>
                </div>
            </form>
            <script src="~/lib/jquery/dist/jquery.min.js"></script>
            <script src="https://cdn.ckeditor.com/4.14.0/full/ckeditor.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
            <script>

                $(document).ready(function () {

                    $("#btnSave").addClass("disable-button");

                    $('.custom-file-input').on("change", function () {
                        var fileName = $(this).val().split("\\").pop();
                        $(this).next('.custom-file-label').html(fileName);
                        $("#fileName").val(fileName);
                        $("#btnSave").removeClass("disable-button");
                    });

                    if ($("#fileName").val() == "") {
                        //alert("Select Image...");;
                    }
                });

            </script>
        </div>
        @section Scripts{
            <partial name="_ValidationScriptsPartial" />

            <script>
 $(function () {
                $('#btnUploadImage').on('click', function (evt) {
                    console.log("btnUploadImage");
                    evt.preventDefault();
                    console.log("btnUploadImage after evt.preventDefault()");
                    $.ajax({
                        url: '@Url.Page("", "OnPostUploadImage")',
                        //data: new FormData(document.forms[0]),
                        contentType: false,
                        processData: false,
                        type: 'post',
                        success: function () {
                            alert('Uploaded by jQuery');
                        }
                    });
                });
            });
            </script>
            }

.cs 文件代码

public async Task<IActionResult> OnPost()
        {
            if (ModelState.IsValid)
            {
                return Page();
            }
            else
            {

                return Page();
            }
        }

        public IActionResult OnPostUploadImage()
        {

            //Some code here
        }

【问题讨论】:

    标签: asp.net asp.net-core razor-pages


    【解决方案1】:

    400 错误,因为 Razor 页面旨在自动保护免受跨站点请求伪造 (CSRF/XSRF) 攻击。您不必编写任何额外的代码。防伪令牌生成和验证自动包含在 Razor 页面中,因为我注意到您在页面上添加了 FormTagHelper。因此,只需修改您的 ajax 以在标头中包含令牌:

    beforeSend: function (xhr) {
        xhr.setRequestHeader("XSRF-TOKEN",
            $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    

    并配置防伪服务以查找 X-CSRF-TOKEN 标头:

    services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
    

    以下文章供您参考:

    Handle Ajax Requests in ASP.NET Core Razor Pages

    要在 ajax 中发布到 OnPostUploadImage 函数,修改 url 为 @Url.Page("", "UploadImage"):

    $.ajax({
        url: '@Url.Page("", "UploadImage")',
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
            $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        contentType: false,
        processData: false,
        type: 'post',
        success: function () {
            alert('Uploaded by jQuery');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多