Domanda

Devo avere un parametro di azione che ha un valore datetime? Esiste un modo standard per farlo? Devo avere qualcosa del tipo:

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

ma sto solo riuscendo a indurlo con qualcosa del tipo:

mysite/Controller/Action/200909211020

e scrivere una funzione personalizzata per gestire questo formato.

Ancora una volta, alla ricerca di un modo MVC ASP.net standard o sanzionato per farlo.

È stato utile?

Soluzione

I due punti nell'URL del tuo primo esempio causeranno un errore (Bad Request), quindi non puoi fare esattamente quello che stai cercando. Oltre a ciò, è assolutamente possibile utilizzare un DateTime come parametro di azione.

Se si utilizza il routing predefinito, questa terza parte dell'URL di esempio raccoglierà il valore DateTime come parametro {id}. Quindi il tuo metodo Action potrebbe apparire così:

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

Probabilmente vorrai usare un Netimeble Datetime come ho fatto io, quindi se questo parametro non è incluso non provocherà un'eccezione. Ovviamente, se non vuoi che sia chiamato " id " quindi aggiungi un'altra voce di percorso sostituendo {id} con il tuo nome preferito.

Finché il testo nell'URL analizzerà un valore DateTime valido, questo è tutto ciò che devi fare. Qualcosa di simile al seguente funziona bene e verrà raccolto nel tuo metodo di azione senza errori:

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

Il problema, in questo caso ovviamente, è che non ho incluso il tempo. Non sono sicuro che ci siano modi per formattare una stringa di data (valida) con l'ora non rappresentata con due punti, quindi se DEVI includere l'ora nell'URL, potresti dover utilizzare il tuo formato e analizzare il risultato in un DateTime manualmente. Supponiamo di sostituire i due punti con un "! & Quot; nel link di azione: new {id = DateTime.Now.ToString (" dd-MM-yyyy HH! mm ")} .

Il tuo metodo di azione non analizzerà questo come una data, quindi la scommessa migliore in questo caso probabilmente lo accetterebbe come una stringa:

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

Modifica: Come notato nei commenti, ci sono alcune altre soluzioni probabilmente migliori delle mie. Quando originariamente ho scritto questa risposta, credo che stavo cercando di preservare l'essenza del formato data e ora nel modo migliore possibile, ma chiaramente la codifica URL sarebbe un modo più corretto di gestirlo. +1 al commento di Vlad.

Altri suggerimenti

Prova a usare toISOString (). Restituisce una stringa in formato ISO8601.

da javascript

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

da c #

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

Usa il valore dei tick. È abbastanza semplice ricostruire in una struttura DateTime

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

Il formato tipico di un URI per ASP .NET MVC è Controller / Azione / Id dove Id è un numero intero

Suggerirei di inviare il valore della data come parametro anziché come parte del percorso:

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

Se il problema persiste, la data potrebbe contenere caratteri non consentiti in un URI e che devono essere codificati. Dai un'occhiata:

 encodeURIComponent(yourstring)

È un metodo all'interno di Javascript.

Sul lato server:

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

Cordiali saluti, qualsiasi parametro url può essere associato a un parametro del metodo di azione purché i nomi siano gli stessi.

Ho pensato di condividere ciò che funziona per me in MVC5 per chiunque cerchi una risposta simile.

La firma del mio controller è simile al seguente:

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

}

My ActionLink si presenta così in Razor:

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

Questo dà un URL come questo:

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

Che codifica la data e l'ora come dovrebbe.

Da MVC 5 è possibile utilizzare il pacchetto Instradamento attributi integrato che supporta un datetime , che accetterà tutto ciò che può essere analizzato in un DateTime.

es.

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

Ulteriori informazioni qui .

Devi prima aggiungere una nuova rotta in global.asax:


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

Il sul tuo controller:



        public ActionResult MyActionName(DateTime date)
        {

        }

Ricorda di mantenere il percorso predefinito nella parte inferiore del metodo RegisterRoutes. Tieni presente che il motore proverà a trasmettere qualsiasi valore inviato in {date} come esempio DateTime, quindi se non può essere lanciato, verrà generata un'eccezione. Se la stringa della tua data contiene spazi o: potresti HTML. Codificali in modo che l'URL possa essere analizzato correttamente. Se no, allora potresti avere un'altra rappresentazione DateTime.

Dividi l'anno, il mese, le ore del giorno e le ore minime

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

Usa un'istruzione If a cascata per costruire il datetime dai parametri passati nell'azione

    ' 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

(Mi scuso per il vb.net ma hai avuto l'idea: P)

Mi rendo conto che funziona dopo aver aggiunto una barra dietro così

mysite/Controller/Action/21-9-2009 10:20/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top