2009-08-03 37 views
48

Tôi cần có thông số hành động có giá trị datetime? Có cách nào tiêu chuẩn để làm điều này không? Tôi cần phải có một cái gì đó như:Làm cách nào để chuyển giá trị datetime dưới dạng thông số URI trong asp.net mvc?

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

nhưng tôi chỉ thành công indoing nó với một cái gì đó như:

mysite/Controller/Action/200909211020 

và viết một hàm custome để đối phó với định dạng này.

Một lần nữa, hãy tìm cách tiêu chuẩn hoặc bị xử lý ASP.net MVC để thực hiện việc này.

Trả lời

34

Dấu hai chấm trong url của ví dụ đầu tiên của bạn sẽ gây ra lỗi (Yêu cầu không hợp lệ) để bạn không thể thực hiện chính xác những gì bạn đang tìm kiếm. Ngoài ra, sử dụng DateTime như một tham số hành động chắc chắn nhất có thể.

Nếu bạn đang sử dụng định tuyến mặc định, phần thứ ba này của url mẫu sẽ lấy giá trị DateTime làm thông số {id}. Vì vậy, phương thức Hành động của bạn có thể trông giống như sau:

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

Có thể bạn sẽ muốn sử dụng Thời gian không có thứ tự như tôi có, vì vậy nếu thông số này không được bao gồm, nó sẽ không gây ra ngoại lệ. Tất nhiên, nếu bạn không muốn nó được đặt tên là "id" thì hãy thêm một mục nhập thay thế khác {id} bằng tên bạn chọn.

Miễn là văn bản trong url sẽ phân tích cú pháp thành giá trị Ngày giờ hợp lệ, đây là tất cả những gì bạn phải làm. Một cái gì đó như sau hoạt động tốt và sẽ được chọn trong phương pháp hành động của bạn mà không có bất kỳ lỗi nào:

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

Bắt, trong trường hợp này, là tôi không bao gồm thời gian. Tôi không chắc chắn có bất kỳ cách nào để định dạng chuỗi ngày (hợp lệ) với thời gian không được đại diện bằng dấu hai chấm, vì vậy nếu bạn PHẢI bao gồm thời gian trong url, bạn có thể cần phải sử dụng định dạng của riêng mình và phân tích kết quả trở lại một DateTime bằng tay. Giả sử chúng ta thay thế dấu hai chấm bằng dấu "!" trong liên kết hành động: new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }.

phương pháp hành động của bạn sẽ thất bại trong việc phân tích này như một ngày để đặt cược tốt nhất trong trường hợp này có lẽ phải chấp nhận nó như là một chuỗi:

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

Edit: Như đã đề cập trong các ý kiến, có một số giải pháp khác được cho là tốt hơn tôi. Khi tôi viết câu trả lời này lần đầu tiên, tôi tin rằng tôi đang cố gắng giữ nguyên bản chất của định dạng ngày tháng nhất có thể, nhưng mã hóa URL rõ ràng sẽ là cách xử lý đúng đắn hơn. 1 nhận xét của Vlad.

+0

Cảm ơn bạn đã xem tổng quan toàn diện. Tôi cần phải nhận thời gian như một phần của tham số, bởi vì đây là một loại ứng dụng định tuyến, nơi các chuyến đi có thời gian mong muốn. Vì vậy, tôi nghĩ rằng tôi sẽ gắn bó với phương pháp định dạng tùy chỉnh của tôi. – GilShalit

+5

Bạn hoàn toàn có thể chuyển giá trị ngày VÀ thời gian qua chuỗi truy vấn mà không phải dùng đến các phần mềm như Thay thế ("!", ":"). Bạn chỉ cần mã hóa url các dấu chấm phẩy - bạn có thể làm điều này trong Javascript bằng cách sử dụng phương thức ** encodeURIComponent **. – Vlad

+1

Bạn có thể vượt qua chỉ là ngày và sau đó vượt qua trong một giá trị số nguyên như một param thứ hai là secconds/phút từ nửa đêm sau đó chỉ cần thêm chúng trở lại trong hành động –

0

Trước tiên, bạn nên thêm một con đường mới trong global.asax:


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

Các trên điều khiển của bạn:



     public ActionResult MyActionName(DateTime date) 
     { 

     } 

Hãy nhớ giữ tuyến đường mặc định của bạn ở dưới cùng của phương pháp RegisterRoutes. Lưu ý rằng động cơ sẽ cố gắng truyền bất kỳ giá trị nào bạn gửi vào {date} như một ví dụ về DateTime, vì vậy nếu nó không thể được đúc thì một ngoại lệ sẽ được ném ra. Nếu chuỗi ngày của bạn chứa dấu cách hoặc: bạn có thể HTML.Encode chúng để URL có thể được phân tích cú pháp chính xác. Nếu không, thì bạn có thể có một biểu diễn DateTime khác.

13

Sử dụng giá trị ve. Nó khá đơn giản để xây dựng lại thành một cấu trúc DateTime

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

Điều này gọn gàng. Những gì tôi thích về giải pháp của tôi là URI vẫn có thể đọc được. – GilShalit

5

định dạng tiêu biểu của một URI cho ASP NET MVC là Controller/Action/Id nơi Id là một số nguyên

tôi sẽ đề nghị gửi các giá trị ngày tháng như một thông số thay vì là một phần của tuyến đường:

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

Nếu nó vẫn cho bạn vấn đề ngày có thể chứa các ký tự không được phép trong URI và cần phải được mã hóa. Kiểm tra:

encodeURIComponent(yourstring) 

Đây là phương pháp trong Javascript.

Trên Side Server:

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

FYI, bất kỳ tham số url có thể được ánh xạ tới một tham số phương pháp hành động chừng nào những cái tên đều giống nhau.

0

Chia ra các năm, tháng, giờ Ngày và Mins

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

Sử dụng một tầng Nếu Bản Tuyên Bố để xây dựng lên các datetime từ các thông số truyền vào Action

' 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 

(Xin lỗi cho vb.net nhưng bạn có ý tưởng: P)

+0

Xin vui lòng không một theo lời khuyên kinh khủng này ... – MarioDS

1

Vì MVC 5 bạn có thể sử dụng gói được xây dựng trong gói Attribute Routing hỗ trợ loại datetime, chấp nhận bất kỳ thứ gì có thể được phân tích cú pháp thành DateTime.

ví dụ:

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

Thông tin thêm here.

24

Cố gắng sử dụng toISOString(). Nó trả về chuỗi theo định dạng ISO8601.

từ javascript

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

từ C#

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

Thats một giải pháp rất gọn gàng –

+0

Với tôi, đây là cách tiếp cận tốt nhất, nó mang lại cho bạn một cách tiêu chuẩn để sắp xếp một đối tượng Ngày và vẫn cung cấp khả năng đọc của con người. Từ C#, bạn có thể sử dụng dateTimeObject.ToString ("o") để tuần tự hóa thành ISO8601 –

4

tôi nghĩ rằng tôi muốn chia sẻ những gì làm việc cho tôi trong MVC5 cho bất cứ ai mà đến tìm kiếm một câu trả lời tương tự.

My khiển Chữ ký trông như thế này:

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

} 

ActionLink của tôi trông như thế này trong Razor:

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

Điều này cho phép một URL như sau:

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

nào mã hóa ngày tháng và thời gian như nó cần.

Các vấn đề liên quan