Html.ActionLink动态参数

时间:2014-05-15 18:55:48

标签: c# asp.net-mvc-4 razor

我有一个下拉列表和下拉列表旁边的链接。单击该按钮时,我希望在控制器上调用操作,以便我可以通过下拉列表中选择的SelectedFileId下载我的文件。问题是,当我在控制台中查看链接URL时,它只是

http://localhost/Download/DownloadFileById

哪个不包括我的参数。我假设这是因为生成html时Model.SelectedFileId为null。我有没有办法让这个URL变得动态,每当我更改下拉列表时都会改变?

我的代码:

@Html.DropDownListFor(x => x.SelectedFileId, Model.FileIds)
@Html.ActionLink("Download File", 
                 "DownloadFileById", 
                 "Download", 
                 new { fileId = Model.SelectedFileId })

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,您希望能够在下拉列表中选择一个项目,并将该值作为参数传递给服务器端操作。

没有javascript就行不通。设置Model.SelectedFileId将仅在呈现页面时设置FileId值。之后它就是客户端,这意味着你需要javascript。

最简单的方法是使用简单的javascript方法。而不是使用ActionLink,创建一个基本的html链接或按钮,并给它一个onclick处理程序。

@Html.DropDownListFor(x => x.SelectedFileId, Model.FileIds, new {id = "FileDownloadList"}) //Give this an id so you can select it later. Also assuming FileIds is a SelectList.
<input type=button onclick="DownloadFile" value="Download File"/> 

然后你需要编写javascript,它将获取所选的id并将其发送到你的action方法服务器端。我不打算使用ajax,因为我认为你不能只使用ajax下载文件。但是,您可以执行ActionLink所做的操作,并将浏览器定向到您的文件中。

function DownloadFile(){
   var fileID = $("#FileDownloadList").val(); //Get selected FileID
   window.location = "http://localhost/Download/DownloadFileById?fileId=" + fileId; //Redirect to file. I am using the full path, but you could use a relative path.
}

这应该执行与ActionLink相同的操作,但动态选择下拉列表中的任何值。

答案 1 :(得分:0)

您对ActionLink使用了错误的重载。您正在使用this one

看起来像

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    Object routeValues,
    Object htmlAttributes
)

但你需要this one,它看起来像是:

@Html.ActionLink("Download File", 
             "DownloadFileById", 
             "Download", 
             new { fileId = Model.SelectedFileId },
             null)