IT story

asp.net mvc에서 날짜 시간 값을 URI 매개 변수로 어떻게 전달합니까?

hot-time 2020. 12. 25. 09:30
반응형

asp.net mvc에서 날짜 시간 값을 URI 매개 변수로 어떻게 전달합니까?


datetime 값이있는 작업 매개 변수가 필요합니까? 이를 수행하는 표준 방법이 있습니까? 다음과 같은 것이 필요합니다.

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

그러나 나는 다음과 같은 것을 통해서만 성공하고 있습니다.

mysite/Controller/Action/200909211020

이 형식을 처리하기 위해 custome 함수를 작성합니다.

다시 말하지만, 표준 또는 승인 된 ASP.net MVC 방법을 찾으십시오.


첫 번째 예의 URL에있는 콜론은 오류 (잘못된 요청)를 발생시켜 원하는 것을 정확히 수행 할 수 없습니다. 그 외에는 DateTime을 작업 매개 변수로 사용하는 것이 가장 확실합니다.

기본 라우팅을 사용하는 경우 예제 URL의이 세 번째 부분은 DateTime 값을 {id} 매개 변수로 선택합니다. 따라서 Action 메서드는 다음과 같습니다.

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

내가 가지고있는 것처럼 Nullable Datetime을 사용하고 싶을 것이므로이 매개 변수가 포함되지 않은 경우 예외가 발생하지 않습니다. 물론, "id"라는 이름을 지정하지 않으려면 {id}를 선택한 이름으로 바꾸는 다른 경로 항목을 추가하십시오.

URL의 텍스트가 유효한 DateTime 값으로 구문 분석되는 한이 작업 만 수행하면됩니다. 다음과 같은 것이 잘 작동하며 오류없이 Action 메서드에서 선택됩니다.

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

물론이 경우에는 시간을 포함하지 않았다. 콜론으로 표시되지 않은 시간으로 (유효한) 날짜 문자열을 형식화하는 방법이 있는지 잘 모르겠습니다. 따라서 URL에 시간을 포함해야하는 경우 고유 한 형식을 사용하고 결과를 다시 구문 분석해야 할 수 있습니다. 수동으로 DateTime. 콜론을 "!"로 바꾼다고 가정 해 보겠습니다. actionlink에서 : 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 인코딩이 명확하게 처리하는 것이 더 적절한 방법이라고 생각합니다. Vlad의 댓글에 +1.


toISOString ()을 사용해보십시오. ISO8601 형식의 문자열을 반환합니다.

자바 스크립트에서

$.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);
}

틱 값을 사용하십시오. DateTime 구조로 다시 빌드하는 것은 매우 간단합니다.

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

ASP .NET MVC에 대한 URI의 일반적인 형식은 Controller / Action / 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 매개 변수를 조치 메소드 매개 변수에 맵핑 할 수 있습니다.


나는 비슷한 대답을 찾는 모든 사람들을 위해 MVC5에서 나를 위해 일하는 것을 공유 할 것이라고 생각했습니다.

내 컨트롤러 서명은 다음과 같습니다.

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

}

내 ActionLink는 Razor에서 다음과 같이 보입니다.

@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

Which encodes the date and time as it should.


Split out the Year, Month, Day Hours and Mins

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

Use a cascading If Statement to Build up the datetime from the parameters passed into the 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

(Apologies for the vb.net but you get the idea :P)


Since MVC 5 you can use the built in Attribute Routing package which supports a datetime type, which will accept anything that can be parsed to a DateTime.

e.g.

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

More info here.


i realize it works after adding a slash behind like so

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

You should first add a new route in global.asax:


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

The on your Controller:



        public ActionResult MyActionName(DateTime date)
        {

        }

Remember to keep your default route at the bottom of the RegisterRoutes method. Be advised that the engine will try to cast whatever value you send in {date} as a DateTime example, so if it can't be casted then an exception will be thrown. If your date string contains spaces or : you could HTML.Encode them so the URL could be parsed correctly. If no, then you could have another DateTime representation.

ReferenceURL : https://stackoverflow.com/questions/1224201/how-do-i-pass-a-datetime-value-as-a-uri-parameter-in-asp-net-mvc

반응형