2014-06-18 60 views
0

我正在开发一个MVC web应用程序。我需要下载一个文件,我已经存储为一个字节[]流在数据库和它的工作正常。我曾经做过的一个按钮单击我调用一个JS函数,并在C#后端调用一个函数,并最终下载文件。以下是我的JQuery代码。MVC Web应用程序如何在没有Request.Querystring的情况下获取参数?

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"); 
     } 

任何人都可以解释为什么请吗?

+4

这是自动MVC模型绑定。这解释了很多细节,回答了方式和原因:http://www.codeproject。com/Articles/710776/Introduction to ASP-NET-MVC-Model-Binding-An-Absol ..这正是你应该做的事情。即使是复杂的对象,如“Person person”或“List myList”。正确的MVC不应该需要Request.Querystring()或FormCollection(除非在特别的动态参数或日志记录中) – arserbin3

+2

@ arserbin3您应该将其作为答案 –

回答

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无法转换,如“一个”不能被放入一个int。该方法调用将失败(期望一个ASP.Net错误页面)。然而,有办法解决此问题:

  • 如果类型为空,该方法将仍然被调用,并且null将是价值。如果转换失败,int? something将被设置为null,并且确保该方法仍然被调用。
  • 您可以将其设置为可选参数:MyMethod(int anotherthing, int something = 0)。注意参数的反转。 可选参数必须始终放在正常(必需)参数之后!这将确保,当something要么不能转换(或根本不是查询字符串的一部分),它会收到您指定的默认值(在我的例子,0

一些言论:

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

谢谢您给我一个洞察。万分感激。 – Mahib

相关问题