Asp.net 如何将模型和附加参数从视图传递到控制器

Asp.net 如何将模型和附加参数从视图传递到控制器,asp.net,asp.net-mvc,asp.net-mvc-5,Asp.net,Asp.net Mvc,Asp.net Mvc 5,使用ASP.NET MVC,在我的视图中,我列出了一些文件并将它们显示为按钮。通过单击每个按钮,应下载相应的文件 为了显示文件列表,我传递了一个要查看的模型,当用户单击每个按钮时,我必须将文件名和原始模型发送回控制器 我找到了一个类似问题的答案,但就我而言,我并不是只有一个按钮。我在视图中呈现的每个文件名都有一个按钮 这是我的观点的代码: @using (Html.BeginForm("DownloadFile", "SharedFolder", Form

使用ASP.NET MVC,在我的视图中,我列出了一些文件并将它们显示为按钮。通过单击每个按钮,应下载相应的文件

为了显示文件列表,我传递了一个要查看的模型,当用户单击每个按钮时,我必须将文件名和原始模型发送回控制器

我找到了一个类似问题的答案,但就我而言,我并不是只有一个按钮。我在视图中呈现的每个文件名都有一个按钮

这是我的观点的代码:

@using (Html.BeginForm("DownloadFile", "SharedFolder", FormMethod.Post))
{
    <div class="col-sm-6">
        <div class="panel panel-info">
            <div class="panel-heading">Files</div>
            <div class="panel-body" style="max-height:300px; height:300px; overflow-y:scroll">
                @foreach (var file in Model.Files)
                {
                    <button type="button" class="btn btn-link btn-sm" onclick="location.href='@Url.Action("DownloadFile", "SharedFolder", new { fileToDownload = file, data = Model })'">
                        <div class="glyphicon glyphicon-file" style="color:dodgerblue">
                            <span style="color:black;">@file</span>
                        </div>
                    </button>
                    <br />
                }
            </div>
        </div>
    </div>
}
当我点击一个文件下载它时,我得到以下错误:

找不到资源

请求的URL:/SharedFolder/DownloadFile

更新:

这是我的ViewModel

public class FolderExplorerViewModel
{
    public int ID { get; set; }
    public List<Folder> Folders { get; set; }
    public List<string> Files { get; set; }
    public string SelectedPath { get; set; }
}
public类FolderExplorerViewModel
{
公共int ID{get;set;}
公用列表文件夹{get;set;}
公共列表文件{get;set;}
公共字符串SelectedPath{get;set;}
}

您不应该像这样存储
data=Model
,这样会导致性能和安全问题

您只需从视图中存储一个
fileToDownload
值。之后,在控制器中,您应该通过
fileToDownload
param获取文件

[HttpPost]
public ActionResult DownloadFile(string fileToDownload)
{
    // download the file by `fileToDownload` param here

    return RedirectToAction("Index");
}

出现此错误的原因是,它试图执行form post,并且没有表示fileToDownload和data的form html元素

实际上,您可以使用锚定标记来调用controllerget操作,而不是使用formpost(因为它只是下载的,不需要在这里使用POST)。正如@Phong提到的,使用fileToDownload,您可能可以检索重定向到索引所需的其他信息

@foreach (var file in Model.Files)
{
    <a href='@Url.Action("DownloadFile", "SharedFolder", new { fileToDownload = file})' title="Click here to download the file">@file</a>
}

如果您仍然想发送模型,那么可以通过ajax的javascript按钮点击事件来发送。

请向我们展示您的
FolderExplorerViewModel
结构。你为什么需要这个?我添加了它,但不确定它是否有助于获得答案。@FLICKER这能回答你的问题吗?如果您需要帮助,请告诉我如何将模型返回控制器?感谢您的回答,让我了解如何使用ajax将模型发送回控制器。我还想下载一个文件,我需要张贴。不确定我是否可以使用ajaxif下载如果您想下载文件,为什么要使用RedirectToAction?我想,你仍然不能用表单后下载和重定向做两件事。试图理解你们的需求-为什么你们需要模型-我的意思是目的?我下载文件后重定向。我想我可以做到,因为在ASP WebForms中,我已经完成了下载和重定向。所以我想我在这里也能做到。据我所知,我不认为在MVC中你能做到这两件事。下载文件后,您需要返回文件内容是否正确?返回文件内容后,您将超出此操作范围。你怎么还能重定向?顺便问一下,你们为什么需要这个模型?我会试试,然后告诉你们。
@foreach (var file in Model.Files)
{
    <a href='@Url.Action("DownloadFile", "SharedFolder", new { fileToDownload = file})' title="Click here to download the file">@file</a>
}
public ActionResult DownloadFile(string fileToDownload)
{
    // do the stuff
    // download would return FileResult on success, not sure what you meant by RedirectToAction("Index")
    // download the file and return Index view
    return RedirectToAction("Index");
}