it-swarm.com.de

Wie übergebe ich einen datetime-Wert als URI-Parameter in asp.net mvc?

Ich muss einen Aktionsparameter haben, der einen datetime-Wert hat. Gibt es einen Standardweg, um dies zu tun? Ich muss etwas haben wie:

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

aber es gelingt mir nur, es mit etwas zu beschreiben:

mysite/Controller/Action/200909211020

und Schreiben einer eigenen Funktion, um mit diesem Format umzugehen.

Suchen Sie nach einer standardmäßigen oder sanktionierten ASP.net-MVC-Methode, um dies zu tun.

54
GilShalit

Der Doppelpunkt in der URL Ihres ersten Beispiels führt zu einem Fehler (Bad Request), sodass Sie nicht genau das tun können, wonach Sie suchen. Ansonsten ist die Verwendung einer DateTime als Aktionsparameter auf jeden Fall möglich.

Wenn Sie das Standard-Routing verwenden, übernimmt der dritte Teil Ihrer Beispiel-URL den DateTime-Wert als Parameter {id}. Ihre Action-Methode könnte also so aussehen:

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

Wahrscheinlich möchten Sie eine Nullable-Datetime wie ich verwenden. Wenn dieser Parameter nicht enthalten ist, führt dies nicht zu einer Ausnahme. Wenn Sie nicht möchten, dass der Name "id" genannt wird, fügen Sie einen weiteren Routeneintrag hinzu, der {id} durch den Namen Ihrer Wahl ersetzt.

Solange der Text in der URL zu einem gültigen DateTime-Wert analysiert wird, müssen Sie dies nur tun. Etwas wie das Folgende funktioniert gut und wird in Ihrer Action-Methode ohne Fehler aufgenommen:

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

Der Haken in diesem Fall ist natürlich, dass ich die Zeit nicht berücksichtigt habe. Ich bin nicht sicher, ob es eine Möglichkeit gibt, eine (gültige) Datumszeichenfolge mit der Uhrzeit zu formatieren, die nicht mit Doppelpunkten dargestellt wird. Wenn Sie also die Uhrzeit in der URL angeben müssen, müssen Sie möglicherweise Ihr eigenes Format verwenden und das Ergebnis erneut analysieren eine DateTime manuell. Sagen wir, wir ersetzen den Doppelpunkt durch ein "!" im actionlink: new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }.

Ihre Aktionsmethode wird dieses Datum nicht als Datum analysieren. Die beste Wette in diesem Fall würde es wahrscheinlich als Zeichenfolge akzeptieren:

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

Edit: Wie in den Kommentaren erwähnt, gibt es einige andere Lösungen, die wahrscheinlich besser sind als meine. Als ich diese Antwort ursprünglich geschrieben habe, glaube ich, ich habe versucht, die Essenz des Datums/Uhrzeit-Formats so gut wie möglich zu erhalten, aber eindeutig wäre die URL-Kodierung eine richtigere Art, dies zu handhaben. +1 zu Vlads Kommentar.

36
Kurt Schindler

Versuchen Sie, toISOString () zu verwenden. Es gibt String im ISO8601-Format zurück.

von Javascript

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

von c #

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

Verwenden Sie den Ticks-Wert. Der Umbau in eine DateTime-Struktur ist ziemlich einfach

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

Ein typisches Format eines URI für ASP .NET MVC ist Controller/Action/Id, wobei Id eine Ganzzahl ist

Ich würde vorschlagen, den Datumswert als Parameter und nicht als Teil der Route zu senden:

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

Wenn Sie immer noch Probleme haben, enthält das Datum möglicherweise Zeichen, die in einem URI nicht zulässig sind und kodiert werden müssen. Auschecken:

 encodeURIComponent(yourstring)

Es ist eine Methode in Javascript.

Auf der Server-Seite:

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

Zu Ihrer Information kann jeder URL-Parameter einem Aktionsmethode-Parameter zugeordnet werden, solange die Namen gleich sind.

5
Roland Schaer

Ich dachte, ich würde teilen, was für mich in MVC5 funktioniert, für jeden, der nach einer ähnlichen Antwort sucht.

Meine Controller-Signatur sieht folgendermaßen aus:

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

}

Mein ActionLink sieht in Razor so aus:

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

Dies gibt eine URL wie diese: 

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

Welches Datum und die Uhrzeit kodiert, wie es sollte. 

5
Sam Ellis

Seit MVC 5 können Sie das eingebaute Attribute Routing -Paket verwenden, das einen datetime-Typ unterstützt, der alles akzeptiert, was in einer DateTime analysiert werden kann.

z.B. 

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

Mehr Infos hier .

1
demoncodemonkey

Sie sollten zuerst eine neue Route in global.asax hinzufügen:


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

Die auf Ihrem Controller:



        public ActionResult MyActionName(DateTime date)
        {

        }

Denken Sie daran, Ihre Standardroute am unteren Rand der RegisterRoutes-Methode beizubehalten. Beachten Sie, dass die Engine versucht, den in {date} gesendeten Wert als DateTime-Beispiel auszugeben. Wenn dies nicht möglich ist, wird eine Ausnahme ausgelöst. Wenn Ihre Datumszeichenfolge Leerzeichen enthält, können Sie sie mit HTML kodieren, damit die URL korrekt analysiert werden kann. Wenn nein, könnten Sie eine andere DateTime-Darstellung haben. 

0
Freddy

ich merke, dass es funktioniert, nachdem ich einen Slash hinterher eingefügt habe

mysite/Controller/Action/21-9-2009 10:20/
0
Angie Loo

Teilen Sie das Jahr, den Monat, die Tagesstunden und die Minuten auf 

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

Verwenden Sie eine kaskadierende If-Anweisung, um die datetime aus den an die Aktion übergebenen Parametern aufzubauen

    ' 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

(Entschuldigung für das vb.net aber du bekommst die Idee: P)

0
JonAlb