2009-08-03 96 views
48

我需要一個具有日期時間值的操作參數?有沒有一個標準的方法來做到這一點?我需要這樣的:如何在asp.net mvc中將日期時間值作爲URI參數傳遞?

mysite/Controller/Action/21-9-2009 10:20 

,但我只成功的東西,如indoing它:

mysite/Controller/Action/200909211020 

,寫的是定製函數來處理這種格式。

再次,尋找一個標準或制裁的ASP.net MVC方式來做到這一點。

回答

34

你的第一個例子的url中的冒號會導致一個錯誤(錯誤的請求),所以你不能完全按照你的要求去做。除此之外,使用DateTime作爲動作參數是絕對有可能的。

如果您使用的是默認路由,則示例url的第三部分將以{id}參數獲取DateTime值。所以,你的行動方法可能是這樣的:

public ActionResult Index(DateTime? id) 
{ 
    return View(); 
} 

您可能需要使用可空日期時間,因爲我有,所以如果不包含此參數,也不會導致異常。當然,如果你不希望它被命名爲「id」,那麼添加另一個路由條目,用你選擇的名稱替換{id}。

只要在URL文本將解析爲一個有效的日期時間值,這是你必須做的。像下面的內容能正常工作,並在你的操作方法將有所回升沒有任何錯誤:

<%=Html.ActionLink("link", "Index", new { id = DateTime.Now.ToString("dd-MM-yyyy") }) %> 

美中不足的,在這種情況下,當然是,我並沒有包括的時間。我不確定有什麼方法可以格式化(有效的)日期字符串而不用冒號表示時間,所以如果您必須在網址中包含時間,則可能需要使用自己的格式並將結果解析回一個DateTime手動。假設我們用「!」代替冒號在動作鏈接中:new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }

你的操作方法將無法解析此作爲一個日期,以便在這種情況下,最好的選擇可能會接受它作爲一個字符串:

public ActionResult Index(string id) 
{ 
    DateTime myDate; 
    if (!string.IsNullOrEmpty(id)) 
    { 
     myDate = DateTime.Parse(id.Replace("!", ":")); 
    } 
    return View(); 
} 

編輯:正如在評論中指出,有其他一些解決方案可以說比我的更好。當我最初編寫這個答案時,我相信我試圖儘可能地保留日期時間格式的本質,但顯然URL編碼是處理這種問題的更合適的方式。 +1給Vlad的評論。

+0

感謝您的全面概述。我確實需要將時間作爲參數的一部分,因爲這是一種路線應用程序,其中行程具有所需的時間。所以我想我會堅持我的自定義格式方法。 – GilShalit 2009-08-04 08:17:36

+5

完全可以通過查詢字符串傳遞日期和時間值,而不需要像Replace(「!」,「:」)這樣的黑客行爲。您只需對分號進行網址編碼 - 您可以使用** encodeURIComponent **方法在Javascript中執行此操作。 – Vlad 2011-09-16 08:36:54

+1

您可以傳入日期,然後傳遞一個整數值作爲第二個參數,即從午夜開始的秒數/分鐘,然後簡單地將它們添加回動作 – 2011-11-17 23:58:32

0

你應該先在Global.asax中添加一個新的路線:


routes.MapRoute(
       "MyNewRoute", 
       "{controller}/{action}/{date}", 
       new { controller="YourControllerName", action="YourActionName", date = "" } 
      ); 

在你的控制器:



     public ActionResult MyActionName(DateTime date) 
     { 

     } 

記住要保持你的默認路由的方法的RegisterRoutes的底部。請注意,引擎會嘗試將您在{date}中發送的任何值作爲DateTime示例進行投射,因此如果無法投射,則會拋出異常。如果您的日期字符串包含空格或:您可以對HTML進行編碼,以便可以正確解析URL。如果不是,那麼你可以有另一個日期時間表示。

13

使用記號值。這是相當簡單的重建成一個DateTime結構

Int64 nTicks = DateTime.Now.Ticks; 
.... 
DateTime dtTime = new DateTime(nTicks); 
+1

這是整潔。我喜歡我的解決方案是,URI仍然可讀。 – GilShalit 2009-08-03 19:58:22

5

一個URI的ASP .NET MVC的典型格式是控制器/動作/ ID其中,ID是一個整數

我建議發送日期值作爲參數,而不是作爲路線的一部分:

mysite/Controller/Action?date=21-9-2009 10:20 

如果它仍然給你帶來麻煩的日期可能包含不在URI中不允許的字符和需要進行編碼。退房時間:

encodeURIComponent(yourstring) 

這是Javascript中的一種方法。

在服務器端:

public ActionResult ActionName(string date) 
{ 
    DateTime mydate; 
    DateTime.Tryparse(date, out mydate); 
} 

僅供參考,任何URL參數,可以只要名稱是相同的映射到操作方法參數。

0

拆分出來的年,月,日小時和分鐘]

routes.MapRoute(
      "MyNewRoute", 
      "{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}", 
      new { controller="YourControllerName", action="YourActionName"} 
     ); 

使用級聯if語句來建立起來,從傳遞到行動

' Build up the date from the passed url or use the current date 
    Dim tCurrentDate As DateTime = Nothing 
    If Year.HasValue Then 
     If Month.HasValue Then 
      If Day.HasValue Then 
       tCurrentDate = New Date(Year, Month, Day) 
      Else 
       tCurrentDate = New Date(Year, Month, 1) 
      End If 
     Else 
      tCurrentDate = New Date(Year, 1, 1) 
     End If 
    Else 
     tCurrentDate = StartOfThisWeek(Date.Now) 
    End If 

(道歉的參數日期時間vb.net但你有這樣的想法:P)

1

由於MVC 5你可以使用內置的Attribute Routing包支持datetime類型,這將接受任何可以解析爲DateTime的東西。

例如

[GET("Orders/{orderDate:datetime}")] 

更多信息here

24

嘗試使用toISOString()。它以ISO8601格式返回字符串。

從JavaScript

$.get('/example/doGet?date=' + new Date().toISOString(), function (result) { 
    console.log(result); 
}); 

從C#

[HttpGet] 
public JsonResult DoGet(DateTime date) 
{ 
    return Json(date.ToString(), JsonRequestBehavior.AllowGet); 
} 
4

我想我會分享我在MVC5什麼適用於任何人,來尋找一個類似的答案。

我的控制器簽名看起來是這樣的:

public ActionResult Index(DateTime? EventDate, DateTime? EventTime) 
{ 

} 

我的ActionLink看起來像這樣在剃刀:

@Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime}) 

這給了這樣一個URL:

Book?EventDate=01%2F20%2F2016%2014%3A15%3A00&EventTime=01%2F20%2F2016%2014%3A15%3A00 

編碼的日期和時間,因爲它應該。

相關問題