【问题标题】:How can I pass an object from my view to my controller in ASP.NET MVC?如何将对象从视图传递到 ASP.NET MVC 中的控制器?
【发布时间】:2020-03-19 05:58:11
【问题描述】:

我想在用户单击 Excel 按钮时下载 Excel 文件。这是我的ModelObject

List<VMStockScreenerModel> listofStockScreener = (List<VMStockScreenerModel>)TempData["StockScreener"];
TempData["StockScreener"] = listofStockScreener;

这是我认为的 Excel 按钮:

<div class="col-md-1 padding-fx text-left" id="btn_FilterStocks">
    <span onclick="DownloadFilterStocks(@listofStockScreener.ToList());" class="pull-right icon-merge" data-toggle="tooltip" title="Download">
        <i class="fa fa-file-excel-o"></i>                        
        <i class="fa fa-cloud-download"></i>                 
    </span>                                                     
</div>

这是我的OnClick 处理程序:

function DownloadFilterStocks() {
    debugger;
    var Obj = [@listofStockScreener];
    Obj = JSON.stringify({ 'Obj': Obj });
    var urls = '@(Html.Raw(Url.Action("Download_StockScreener","Home", new { Obj = "_Obj_"},Request.Url.Scheme)))'.replace("_Obj_", Obj);                   
}

控制器代码

public FileResult Download_StockScreener(VMStockScreenerModel Obj)
        {
            try
            {
                string fileName = string.Empty;
                string filePath = string.Empty;
                string fileName_filePath = string.Empty;


                fileName_filePath = StockScreener_DownloadExcel(Obj);
                if (fileName_filePath.Contains("@"))
                {
                    filePath = fileName_filePath.Split('@')[0];
                    fileName = fileName_filePath.Split('@')[1];
                }
                if (fileName != "")
                {
                    //return File(filePath, "text/csv", fileName);

                }

                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                Log.Logging("HomeController => Download_StockScreener", ex.Message + "\n" + ex.StackTrace);

            } return null;
        }

【问题讨论】:

  • 你能告诉我们控制器代码吗?
  • 您好,欢迎您。我建议您查看 HTML 的源代码作为浏览器的输出。我想你会发现你的 listofStockScreener 对象没有像你期望的那样写入标记或 JavaScript。很可能,它是作为类的名称写的,而不是任何内容的实际列表。相反,您可能希望在您的 listofStockScreener 上执行 for 循环并为每个按钮显示一个 Excel 按钮 - 当然,假设您希望能够为每个 VMStockScreenerModel 实例下载一个文件listofStockScreener.
  • 另外,假设您希望通过VMStockScreenerModel 下载,VMStockScreenerModel 上的哪个属性对应于您的 Excel 文件?那是什么格式的?也就是说,它是 Excel 文档的路径吗?文件的唯一标识符?还是它实际上是对 C# 中的二进制或文件对象的引用?这将影响您编写代码的方式。

标签: javascript c# asp.net .net asp.net-mvc


【解决方案1】:

我希望我可以通过建议您为使解决方案发挥作用所需采取的步骤来指导您找到答案,而不是为您编写整个代码:

  1. 代替span,将元素设为锚点a
  2. 在没有查询字符串部分的情况下呈现锚的 URL 服务器端(MVC 视图)。示例:&lt;a href="www.mydomain.com/Stocks/ExportToExcel" onclick="DownloadFilterStocks(this)"&gt;Export&lt;/a&gt;
  3. 在锚点的点击事件中,执行以下操作:
    function DownloadFilterStocks(elem) {
        debugger;
        var Obj = [@listofStockScreener];

        var $elem = $(elem);

        //this converts JS object to query string
        var qParams = $.param(Obj); 

        //append query string to the anchor's base url
        var newUrl = $elem.attr('href') + '?' + qParams; 

        //assign new url
        $elem.attr('href', newUrl);
    }

它的工作方式是:

  1. 点击导出链接时,JS代码会先于服务器端执行。
  2. JS 将使用查询字符串更新 URL/href
  3. 服务器端代码将使用新 URL 执行

希望对您有所帮助。我最终还是写了一些代码。

注意:我的回答假设您的服务器端代码是有效代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2010-12-28
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多