剃须刀页面 asp-page-handler 按钮不起作用

Posted

技术标签:

【中文标题】剃须刀页面 asp-page-handler 按钮不起作用【英文标题】:razor page asp-page-handler button not work 【发布时间】:2021-08-31 21:26:57 【问题描述】:

我正在实现一个上传下载文件的网络服务器。

到目前为止,我在看MS教程的同时成功实现了它。 我已经实现了一个新的按钮(下载)功能,我想知道如何通过网页上的按钮执行特定的功能。

我尝试了很多搜索并尝试关注,但没有成功。

我的代码或其他情况似乎有问题,但我是网络编程新手,所以我不知道是什么问题。

这个cshtml代码

@page "id"
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

@model WebApplication1.Pages.test.BufferedMultipleFileUploadPhysicalModel
@ ViewData["Title"] = "Buffered Multiple File Upload (Physical)"; 


<h1>Upload multiple buffered files to physical storage with one file upload control</h1>

<p>One or more files can be selected by the visitor. The following form's page handler saves the file(s) to disk.</p>

<h4>graphic_tbl</h4>
<hr />


<form enctype="multipart/form-data" method="post">
    <dl>
        <dt>
            <label asp-for="FileUpload.FormFiles"></label>
        </dt>
        <dd>
            <input asp-for="FileUpload.FormFiles" type="file" multiple />
            <span asp-validation-for="FileUpload.FormFiles"></span>
        </dd>
    </dl>
    <input asp-page-handler="Upload" class="btn" type="submit" value="Upload" />
    <div class="form-group">
        <label for="version" class="col-sm-2 control-label">version</label>
        <div class="col-sm-10">
            <input type="text" class="form-control" name="version">
        </div>
    </div>
</form>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.view_Join_Model[0].ver)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.view_Join_Model[0].date)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.view_Join_Model[0].dateupdate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.view_Join_Model[0].resource_link)
            </th>
            <th>
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.view_Join_Model)
        
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.ver)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.date)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.dateupdate)
                </td>
                <td>
                    @Html.DisplayFor((modelItem => item.resource_link))

                </td>

                <td>
*this part*
                <input asp-page-handler="DownloadFile" class="btn" type="submit" value="Download" />

                    @*<button type="submit" asp-page-handler="DownloadFile" class="btn btn-outline-info"
                id=item.resourceid>
            Donwload
        </button>*@
                </td>

            </tr>
        
    </tbody>


</table>


<p class="result">
    @Model.Result
</p>


这个cs文件

public class BufferedMultipleFileUploadPhysicalModel : PageModel
    
        [BindProperty]
        public BufferedMultipleFileUploadPhysical FileUpload  get; set; 
        [BindProperty]
        public model_version_tbl model_Version_Tbl  get; set; 
        [BindProperty]
        public resource_tbl resource_Tbl  get; set; 
        public IList<fileJoinModel> view_Join_Model get; set; 

        [BindProperty]
        public string version  get; set; 
        public string Result  get; private set; 
        public SelectList seletcList  get; set; 

        public void OnPost()
        
            
        
        public FileContentResult OnGetDownloadFile(int resoruceId)
        
            var querydata =_context.resource_tbl.Find(resoruceId);
           
            byte[] fileBytes = GetFile(querydata.resource_link);
            return File(
                fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, querydata.resource_link);
        

        byte[] GetFile(string s)
        
            System.IO.FileStream fs = System.IO.File.OpenRead(s);
            byte[] data = new byte[fs.Length];
            int br = fs.Read(data, 0, data.Length);
            if (br != fs.Length)
                throw new System.IO.IOException(s);
            return data;
        
    

    public class BufferedMultipleFileUploadPhysical
    
        [Required]
        [Display(Name = "File")]
        public List<IFormFile> FormFiles  get; set; 

        [Display(Name = "Note")]
        [StringLength(50, MinimumLength = 0)]
        public string Note  get; set; 
    


【问题讨论】:

【参考方案1】:

1.首先,asp-page-handler不能与GET方法一起使用,可以参考link,所以需要将OnGetDownloadFile改为 OnPostDownloadFile.

2.另外,asp-page-handler需要和form一起使用,可以使用如下代码:

<form method="post">
        <input asp-page-handler="DownloadFile" class="btn" type="submit" value="Download" />
    </form>

3.如果要获取"Upload/id"中的id,需要将int resoruceId改为int id

【讨论】:

以上是关于剃须刀页面 asp-page-handler 按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从一个剃须刀页面到另一个带有链接的页面

使用 AJAX POST 部分返回剃须刀页面

无法在 Razor 页面中选择单选按钮

ASP.net 剃须刀页面和多选,在选择中发布所有项目

如何在asp.net核心剃须刀页面中显示主/详细模式弹出

Razor:asp-page-handler 不会触发处理程序并抛出 400 错误