我需要一個具有日期時間值的操作參數?有沒有一個標準的方法來做到這一點?我需要這樣的:如何在asp.net mvc中將日期時間值作爲URI參數傳遞?
mysite/Controller/Action/21-9-2009 10:20
,但我只成功的東西,如indoing它:
mysite/Controller/Action/200909211020
,寫的是定製函數來處理這種格式。
再次,尋找一個標準或制裁的ASP.net MVC方式來做到這一點。
我需要一個具有日期時間值的操作參數?有沒有一個標準的方法來做到這一點?我需要這樣的:如何在asp.net mvc中將日期時間值作爲URI參數傳遞?
mysite/Controller/Action/21-9-2009 10:20
,但我只成功的東西,如indoing它:
mysite/Controller/Action/200909211020
,寫的是定製函數來處理這種格式。
再次,尋找一個標準或制裁的ASP.net MVC方式來做到這一點。
你的第一個例子的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的評論。
你應該先在Global.asax中添加一個新的路線:
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{date}",
new { controller="YourControllerName", action="YourActionName", date = "" }
);
在你的控制器:
public ActionResult MyActionName(DateTime date)
{
}
記住要保持你的默認路由的方法的RegisterRoutes的底部。請注意,引擎會嘗試將您在{date}中發送的任何值作爲DateTime示例進行投射,因此如果無法投射,則會拋出異常。如果您的日期字符串包含空格或:您可以對HTML進行編碼,以便可以正確解析URL。如果不是,那麼你可以有另一個日期時間表示。
使用記號值。這是相當簡單的重建成一個DateTime結構
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
這是整潔。我喜歡我的解決方案是,URI仍然可讀。 – GilShalit 2009-08-03 19:58:22
一個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參數,可以只要名稱是相同的映射到操作方法參數。
拆分出來的年,月,日小時和分鐘]
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)
由於MVC 5你可以使用內置的Attribute Routing包支持datetime
類型,這將接受任何可以解析爲DateTime的東西。
例如
[GET("Orders/{orderDate:datetime}")]
更多信息here。
嘗試使用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);
}
我想我會分享我在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
編碼的日期和時間,因爲它應該。
感謝您的全面概述。我確實需要將時間作爲參數的一部分,因爲這是一種路線應用程序,其中行程具有所需的時間。所以我想我會堅持我的自定義格式方法。 – GilShalit 2009-08-04 08:17:36
完全可以通過查詢字符串傳遞日期和時間值,而不需要像Replace(「!」,「:」)這樣的黑客行爲。您只需對分號進行網址編碼 - 您可以使用** encodeURIComponent **方法在Javascript中執行此操作。 – Vlad 2011-09-16 08:36:54
您可以傳入日期,然後傳遞一個整數值作爲第二個參數,即從午夜開始的秒數/分鐘,然後簡單地將它們添加回動作 – 2011-11-17 23:58:32