67 votes

Comment passer une valeur de date en tant que paramètre URI dans asp.net mvc ?

Je dois avoir un paramètre d'action qui a une valeur de date ? Existe-t-il un moyen standard de le faire ? J'ai besoin d'avoir quelque chose comme :

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

mais je ne réussis à le faire qu'avec quelque chose comme :

mysite/Controller/Action/200909211020

et écrire une fonction personnalisée pour traiter ce format.

Encore une fois, je cherche un moyen standard ou sanctionné par ASP.net MVC pour faire cela.

42voto

Kurt Schindler Points 8106

Les deux points dans l'url de votre premier exemple vont provoquer une erreur (Bad Request) et vous ne pourrez pas faire exactement ce que vous cherchez. À part cela, l'utilisation d'un DateTime comme paramètre d'action est tout à fait possible.

Si vous utilisez le routage par défaut, la troisième partie de votre exemple d'url va récupérer la valeur DateTime comme paramètre {id}. Votre méthode d'action pourrait donc ressembler à ceci :

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

Vous voudrez probablement utiliser un Datetime Nullable comme je l'ai fait, de sorte que si ce paramètre n'est pas inclus, il ne provoquera pas d'exception. Bien sûr, si vous ne voulez pas qu'il soit nommé "id", ajoutez une autre entrée de route en remplaçant {id} par le nom de votre choix.

Tant que le texte de l'url est converti en une valeur DateTime valide, c'est tout ce que vous avez à faire. Quelque chose comme ce qui suit fonctionne bien et sera pris en compte dans votre méthode Action sans aucune erreur :

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

Le problème, dans ce cas bien sûr, est que je n'ai pas inclus l'heure. Je ne suis pas sûr qu'il existe des moyens de formater une chaîne de date (valide) avec l'heure non représentée par des deux-points, donc si vous DEVEZ inclure l'heure dans l'url, vous devrez peut-être utiliser votre propre format et analyser manuellement le résultat en DateTime. Supposons que nous remplacions les deux-points par un " !" dans le lien d'action : new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") } .

Votre méthode d'action ne parviendra pas à l'interpréter comme une date. Dans ce cas, le mieux est probablement de l'accepter comme une chaîne de caractères :

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

Edit : Comme indiqué dans les commentaires, il existe d'autres solutions, sans doute meilleures que la mienne. Lorsque j'ai écrit cette réponse à l'origine, je crois que j'essayais de préserver au mieux l'essence du format de date et d'heure, mais il est clair que l'encodage URL serait une façon plus appropriée de traiter cette question. +1 au commentaire de Vlad.

0 votes

Merci pour cet aperçu complet. J'ai effectivement besoin de recevoir l'heure en tant que paramètre, car il s'agit d'une sorte d'application de routage où les trajets ont une heure souhaitée. Je pense donc que je vais m'en tenir à ma méthode de formatage personnalisé.

6 votes

Il est tout à fait possible de transmettre une valeur de date ET d'heure via la chaîne de requête sans avoir recours à des astuces comme Replace(" !", " :"). Il vous suffit de coder les points-virgules en url - vous pouvez le faire en Javascript en utilisant la fonction encodeURIComponent méthode.

1 votes

Vous pouvez transmettre uniquement la date, puis transmettre une valeur entière en tant que second paramètre, à savoir les secondes/minutes à partir de minuit, puis les ajouter simplement dans l'action.

18voto

Utilisez la valeur des ticks. Il est assez simple de le reconstruire en une structure DateTime

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

2 votes

C'est chouette. Ce que j'aime dans ma solution, c'est que l'URI reste lisible.

5voto

Roland Schaer Points 605

Le format typique d'un URI pour ASP.NET MVC est Controller/Action/Id où Id est un entier.

Je suggère d'envoyer la valeur de la date en tant que paramètre plutôt qu'en tant que partie de la route :

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

Si les problèmes persistent, il se peut que la date contienne des caractères qui ne sont pas autorisés dans un URI et qui doivent être encodés. Consultez le site :

 encodeURIComponent(yourstring)

Il s'agit d'une méthode au sein de Javascript.

Du côté du serveur :

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

Pour information, tout paramètre d'url peut être associé à un paramètre de méthode d'action, à condition que les noms soient identiques.

1voto

JonAlb Points 1346

Répartir l'année, le mois, le jour, les heures et les minutes.

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

Utilisez une déclaration If en cascade pour construire la date à partir des paramètres passés dans l'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

(Je m'excuse pour le vb.net mais vous avez compris l'idée :P)

0voto

Freddy Points 1658

Vous devez d'abord ajouter une nouvelle route dans global.asax :

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

Le sur votre contrôleur :

        public ActionResult MyActionName(DateTime date)
        {

        }

N'oubliez pas de conserver votre route par défaut au bas de la méthode RegisterRoutes. Sachez que le moteur essaiera de convertir la valeur que vous envoyez dans {date} en un exemple de DateTime, donc si elle ne peut pas être convertie, une exception sera levée. Si votre chaîne de date contient des espaces ou des :, vous pouvez les coder en HTML pour que l'URL soit analysée correctement. Sinon, vous pouvez avoir une autre représentation de DateTime.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X