我正在开发MVC Web应用程序。我需要下载一个文件,我把它作为byte []流存储在DB中并且工作正常。我曾经在单击按钮上执行的操作我调用了JS函数并调用了C#后端的函数并最终下载了该文件。以下是我的JQuery代码。
var DownloadDRR = function ()
{
var InvoiceId = $(".invoiceid").text();
location.href = location.origin + "/Invoicing/DownloadDRR?InvoiceId=" + InvoiceId;
}
在后端我通常会得到像这样的查询字符串
Request.Querystring("InvoiceId");
但是我在我的应用程序中意外地发现,如果我写下以下信息,它仍然会InvoiceId
而不使用Request.QueryString()
。
public FileResult DownloadDRR(int InvoiceId)
{
InvoicingService Invoices = new InvoicingService(Client);
byte[] RawExcel = Invoices.GetExcelService(InvoiceId);
MemoryStream stream = new MemoryStream(RawExcel);
stream.Seek(0, SeekOrigin.Begin);
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "test.xlsx");
}
有人可以解释为什么吗?
答案 0 :(得分:1)
MVC专门自动化大量绑定(模型绑定是使用的术语)。
myurl.com/MyController/MyMethod?something=a&anotherthing=1234
//example 1
public ActionResult MyMethod(string something, string anotherthing)
//example2
public ActionResult MyMethod(string something, int anotherthing)
适用于这两个例子。即使你的查询字符串在技术上只包含字符串值,MVC也会尝试将其解析为所需的类型。
你唯一需要注意的是 querystring参数名称与方法的参数名称匹配。其余的是自动完成的:)
//example3
public ActionResult MyMethod(int something, int anotherthing)
在此示例中,something
无法转换,因为“a”无法放入int中。方法调用将失败(期望ASP.Net错误页面)。但是,有很多方法可以解决这个问题:
null
将是值。如果转换失败,int? something
将被设置为null
,这样可以确保该方法仍然被调用。MyMethod(int anotherthing, int something = 0)
。注意参数的反转。 必须始终在正常(必需)参数之后放置可选参数!这将确保当something
无法转换(或者根本不是查询字符串的一部分)时,它将收到您指定的默认值(在我的示例中为0
)一些评论: