2014-06-18 62 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

相關問題