0

我有一个 C# 方法,如果你从另一个 C# 方法调用它,但不能从 javascript 调用它。如何通过我的 ajax 调用使其工作?

我需要根据传入的 ID 获取文件,所以我有一个带有 statusID 的 ajax 帖子。该 ID 在我的 C# 方法中提取了正确的文件,它只是没有给出文件保存对话框。

但是,如果我从我的 C# 页面加载方法中调用它并使用静态 statusID 进行测试,它就可以正常工作。

这是 C# 方法:

    public void Get_Attachment_By_StatusID(int statusID)
    {
        SqlDataReader _reader = null;
        string _connString = "Data Source=133.31.32.33;Initial Catalog=Reports;Integrated Security=True";

        string sql = "SELECT a.StatusID ,a.DocumentName ,a.MIMETypeID ,a.Binary ,a.CreatedDate ,a.CreatedBy " +
            ",b.MIMEType FROM Attachments a Inner join  MIME_Types b on  a.MIMETypeID = b.ID " +
            "WHERE [StatusID] = {0} ";

        sql = string.Format(sql, statusID);

        try
        {
            _connection = new SqlConnection(_connString);
            _connection.Open();

            using (SqlCommand cmd = new SqlCommand(sql, _connection))
            {
                cmd.CommandType = System.Data.CommandType.Text;
                _reader = cmd.ExecuteReader();

                if (_reader.HasRows)
                {
                    while (_reader.Read())
                    {
                        System.Web.HttpContext.Current.Response.ClearContent();
                        System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                        System.Web.HttpContext.Current.Response.ContentType = _reader["MIMEType"].ToString();
                        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + _reader["DocumentName"].ToString() + ";");
                        byte[] b = (byte[])_reader["Binary"];
                        System.Web.HttpContext.Current.Response.BinaryWrite(b);
                        System.Web.HttpContext.Current.Response.Flush();
                        System.Web.HttpContext.Current.Response.Close();
                    }

                }

                _reader.Close();
                _connection.Close();
            }
        }
        catch (Exception ex)
        {
            //Log exception to error Logging app
            string err = ex.ToString();

        }
        finally
        {
            if (_connection != null)
                _connection.Close();
            if (_reader != null)
                _reader.Close();
        }
    }

这是我在 javascript 中从我的页面调用它的方式:

function GetFile(statusID) {
    var url = '/Home/Get_Attachment_By_StatusID';

    $.ajax({
        url: url,
        type: 'post',
        cache: false,
        data: JSON.stringify({ "statusID": statusID }),
        contentType: 'application/json',
        success: function (data) {

        }
    });
}

没发生什么事。在 Chrome 中,我在 javascript 控制台中看不到任何内容,在 IE 中,我的控制台吐出:“XML5619:文档语法不正确。”

同样,如果我进入控制器,并在我的页面加载方法中调用该方法,它会显示保存文件对话框并很好地保存文件。所以我的 javascript/jquery/ajax 一定做错了什么......

我是 MVC4 的新手,我知道我在这里遗漏了一些东西。我错过了什么?

4

2 回答 2

2

使用 window.open('CONTROLLER_URL/STATUS_ID'); 而不是 AJAX 请求。

<a target="_blank" href="javascript:window.open('/Home/Get_Attachment_By_StatusID/12345');">Test</a>
于 2013-07-22T17:59:55.597 回答
1

这是一个建议,主要基于 LastCoder 的回答:

使用属性装饰您的操作[HttpGet]并将参数名称更改为id

[HttpGet]
public void Get_Attachment_By_StatusID(int id) ...

现在在您的客户端代码中,只需执行以下操作:

function GetFile(statusID) {
    var url = '/Home/Get_Attachment_By_StatusID/'+statusID;
    window.location=url;
}
于 2013-07-22T18:26:36.250 回答