使用<button>和jquery将参数传递给C#控制器方法

时间:2018-10-09 12:32:48

标签: c# jquery asp.net-mvc

我有一个引导程序模版,其中包含许多按钮,可帮助下载不同格式的文件。当我使用如下设置onclick函数时,我能够输入控制器方法:

onclick="location.href='@Url.Action("DownloadAsJPG", "Home")'"

我想基于按下的按钮进行一些基于条件的文件下载,因此我正在考虑通过设置参数的值属性来传递参数herehere按钮

HTML:

<button type="button" id="tojpg" class="btn btn-outline-primary" value="jpg">JPG</button>
<button type="button" class="btn btn-outline-primary" value="jpgcmyk">JPG-CMYK</button>
<button type="button" class="btn btn-outline-primary" value="jpgrgb">JPG-RGB</button>

控制器方法中的参数始终为null。我不确定我错过了什么。

控制器方法:

public FileResult DownloadAsJpg(string argument)
{ Some action }

我试图玩一个我在stackoverflow问题上发现的jquery,但这个问题也无济于事,我无法使用此jquery到达控制器。

jQuery

$('#tojpg').click(function (e) {
        e.preventDefault();
        window.location = '/Home/DownloadAsJpg?argument=' + $('#tojpg').val();
    });

任何提示将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果可以通过

与您的控制器联系,
onclick="location.href='@Url.Action("DownloadAsJPG", "Home")'"

,只想传递一些参数。您可以像

onclick="location.href='@Url.Action("DownloadAsJPG", "Home", new { argument = "tojpg" })'"

或借助Jquery事件

  

编辑

尝试将事件包装到$(document).ready()中。根据我的经验,大多数情况下,无法进行事件的原因是事件绑定发生时尚未创建按钮。

$(document).ready(function() {
    $('#tojpg').click(function (e) {
        e.preventDefault();
        location.href = '@Url.Action("DownloadAsJPG", "Home", new { argument = "tojpg" })';
    });
}

如果您不想为每个按钮选项编写单独的事件,则可以创建类似这样的内容。

<button type="button" class="btn btn-outline-primary" value="jpg">JPG</button>
<button type="button" class="btn btn-outline-primary" value="jpgcmyk">JPG-CMYK</button>
<button type="button" class="btn btn-outline-primary" value="jpgrgb">JPG-RGB</button>

和这样的Jquery事件

$(document).ready(function() {
    $('.btn').click(function () {
        location.href = '@Url.Action("DownloadAsJPG", "Home", new { argument = "'+ $(this).attr("value") +'" })';
    });
}

应该可以。

答案 1 :(得分:1)

有两种解决方法:

选项1

<button />不属于表单要发布的数据。这就是为什么它不会在服务器端出现。您应该将其更改为如下输入:

<input type="submit" name="argument" value="jpg" />

此字段的名称应与操作中参数的名称相同。由于这是一个input字段,因此浏览器会将其与整个帖子一起发送。这就是您所引用的帖子中要做的事情。

选项2

如果您想改用window.location,则需要确保该操作允许执行GET请求,并且您将argument作为查询字符串传递:

onclick="location.href='@Url.Action("DownloadAsJPG", "Home", new { argument = "jpg" })'"