web-dev-qa-db-fra.com

Comment passer une valeur datetime en tant que paramètre d'URI dans asp.net mvc?

J'ai besoin d'un paramètre d'action qui a une valeur datetime? Y at-il un moyen standard de le faire? J'ai besoin de quelque chose comme:

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

mais je n'y parviens que par quelque chose comme:

mysite/Controller/Action/200909211020

et écrire une fonction custome pour gérer ce format.

Encore une fois, recherchez une méthode standard ou sanctionnée par MVC ASP.net pour le faire.

54
GilShalit

Les deux points dans l'URL de votre premier exemple vont provoquer une erreur (Requête incorrecte), vous ne pouvez donc pas faire exactement ce que vous recherchez. En dehors de cela, l'utilisation d'un DateTime en tant que paramètre d'action est tout à fait possible.

Si vous utilisez le routage par défaut, cette 3ème partie de votre exemple d'URL va récupérer la valeur DateTime en tant que paramètre {id}. Donc, votre méthode d'action pourrait ressembler à ceci:

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

Vous voudrez probablement utiliser une date et heure Nullable comme moi, donc si ce paramètre n'est pas inclus, cela ne provoquera pas d'exception. Bien sûr, si vous ne voulez pas qu'il s'appelle "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 analysera une valeur DateTime valide, c'est tout ce que vous avez à faire. Quelque chose comme ce qui suit fonctionne bien et sera repris dans votre méthode Action sans erreur:

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

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

Votre méthode d'action ne parviendra pas à analyser cette date en tant que date. Par conséquent, la meilleure option dans ce cas serait probablement de l'accepter en tant que chaîne:

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 les miennes. Lorsque j’ai écrit cette réponse, j’ai eu l’impression que j’essayais de préserver au mieux l’essence du format date-heure, mais il est clair que le codage d’URL serait plus approprié. +1 au commentaire de Vlad.

36
Kurt Schindler

Essayez d'utiliser toISOString (). Il retourne une chaîne au format ISO8601.

de javascript

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

de c #

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

Utilisez la valeur ticks. C'est assez simple de reconstruire une structure DateTime

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

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

Je suggérerais d'envoyer la valeur de la date en tant que paramètre plutôt que dans le cadre de la route:

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

Si le problème persiste, la date peut contenir des caractères non autorisés dans un URI et qui doivent être codés. Check-out:

 encodeURIComponent(yourstring)

C'est une méthode en Javascript.

Du côté du serveur:

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

Pour votre information, tout paramètre d’URL peut être associé à un paramètre de méthode d’action, à condition que les noms soient les mêmes.

5
Roland Schaer

Je pensais partager ce qui fonctionne pour moi dans MVC5 pour tous ceux qui recherchent une réponse similaire.

Mon contrôleur Signature ressemble à ceci:

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

}

Mon ActionLink ressemble à ceci dans Razor:

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

Cela donne une URL comme ceci: 

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

Qui code la date et l'heure comme il se doit. 

5
Sam Ellis

Depuis MVC 5, vous pouvez utiliser le package intégré Attribute Routing qui prend en charge un type datetime, qui accepte tout ce qui peut être analysé en tant que DateTime.

par exemple. 

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

Plus d'infos ici .

1
demoncodemonkey

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 garder 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 tant qu'exemple DateTime. Par conséquent, s'il ne peut pas être converti, une exception sera levée. Si votre chaîne de date contient des espaces ou: vous pouvez utiliser HTML.Encode pour que l'URL puisse être analysée correctement. Si non, vous pourriez avoir une autre représentation DateTime. 

0
Freddy

je me rends compte que cela fonctionne après avoir ajouté une barre oblique derrière comme si

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

Séparer l'année, le mois, le jour et les minutes 

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

Utilisez une instruction If en cascade pour générer la date/heure à partir des paramètres transmis à 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

(Toutes mes excuses pour le vb.net mais vous avez l’idée: P)

0
JonAlb