MVC Web应用程序如何在没有Request.Querystring的情况下获取参数?

时间:2014-06-18 13:43:19

标签: c# jquery asp.net-mvc

我正在开发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");
        }

有人可以解释为什么吗?

1 个答案:

答案 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

一些评论:

  • 您可以编写比仅转换值更深入的自定义模型绑定器。但是,这不是默认的MVC行为。如果您需要,可以添加它,这仍然很好。
  • 并非所有参数都始终是查询字符串的一部分。如果您发出 POST 请求(而不是更宽松的 GET 请求),您将看不到查询字符串。值仍然会传递,但不会作为请求的URL的一部分。这是一个可以通过Google找到大量信息的主题。