Pergunta

Eu preciso ter um parâmetro de ação que tem um valor de data e hora? Existe uma maneira padrão para fazer isso? Eu preciso ter algo como:

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

mas eu só estou conseguindo indoing-lo com algo como:

mysite/Controller/Action/200909211020

e escrever uma função custume para lidar com este formato.

Mais uma vez, procurando uma maneira padrão ou sancionado ASP.net MVC para fazer isso.

Foi útil?

Solução

Os dois pontos na url do seu primeiro exemplo vai causar um erro (Bad Request) para que você não pode fazer exatamente o que você está procurando. Fora isso, usando um DateTime como um parâmetro de ação é definitivamente possível.

Se você estiver usando o roteamento padrão, esta 3ª parcela de seu exemplo url está indo para pegar o valor DateTime como o parâmetro {id}. Portanto, o seu método de ação pode ter esta aparência:

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

Você provavelmente vai querer usar um Nullable DateTime como eu tenho, por isso, se este parâmetro não está incluído não vai causar uma exceção. Claro, se você não quer que ele seja chamado "id", em seguida, adicionar outra entrada de rota substituindo {id} com o seu nome de escolha.

Enquanto o texto na url irá analisar para um valor DateTime válido, isso é tudo que você tem que fazer. Algo como o seguinte funciona bem e vai ser pego em seu método de ação sem erros:

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

O problema, neste caso, é claro, é que eu não inclui o tempo. Eu não estou certo de que há alguma maneira de formatar um texto de data (válido) com o tempo não representado com dois pontos, por isso, se você deve incluir o tempo no url, você pode precisar usar seu próprio formato e analisar a volta resultado em um DateTime manualmente. Digamos que substituir os dois pontos com um "!" na actionlink:. new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }

Seu método de ação deixará de analisar isso como uma data de modo a melhor aposta, neste caso, provavelmente a aceitá-la como uma string:

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

Editar: Como observado nos comentários, existem algumas outras soluções sem dúvida melhor que a minha. Quando eu originalmente escreveu esta resposta Eu acredito que eu estava tentando preservar a essência do formato de data e hora da melhor forma possível, mas claramente URL codificação seria uma maneira mais adequada de lidar com isso. +1 ao comentário de Vlad.

Outras dicas

Tente usar toISOString (). Ele retorna string no formato ISO8601.

de javascript

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

a partir de c #

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

Use o valor carrapatos. É muito simples para reconstruir em uma estrutura DateTime

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

formato típico de uma URI para ASP .NET MVC é Controller / Ação / Id onde Id é um inteiro

Gostaria de sugerir o envio do valor de data como um parâmetro e não como parte da rota:

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

Se ele ainda está lhe dando problemas a data pode conter caracteres que não são permitidos em um URI e necessidade de ser codificada. Confira:

 encodeURIComponent(yourstring)

É um método dentro de Javascript.

No lado do servidor:

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

FYI, qualquer parâmetro url pode ser mapeado para um parâmetro de método de ação, desde que os nomes são os mesmos.

Eu pensei em compartilhar o que funciona para mim em MVC5 para qualquer um que vem à procura de uma resposta similar.

meu controlador Assinatura esta aparência:

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

}

Meu actionlink olhares como este em Navalha:

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

Isto dá uma URL como esta:

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

que codifica a data ea hora como deveria.

Desde MVC 5 você pode usar o construída em pacote Atributo Routing que suporta um tipo datetime, que vai aceitar qualquer coisa que possa ser analisada para um DateTime.

por exemplo.

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

Mais informações aqui .

Você deve primeiro adicionar uma nova rota no global:


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

A no seu controlador:



        public ActionResult MyActionName(DateTime date)
        {

        }

Lembre-se de manter a sua rota padrão na parte inferior do método RegisterRoutes. Esteja ciente de que o motor vai tentar lançar o valor que você enviar em {data} como um exemplo DateTime, por isso, se ele não pode ser escalado em seguida, uma exceção será lançada. Se a sua seqüência de data contém espaços ou: você poderia Html.Encode-los de modo que o URL pode ser analisado corretamente. Se não, então você pode ter uma outra representação DateTime.

Dividir o ano, mês, dia horas e Mins

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

Use uma cascata Se Statement para edificar a data e hora a partir dos parâmetros passados ??para o 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

(Desculpas para o vb.net, mas você começa a idéia: P)

Eu percebo que funciona após a adição de uma barra para trás como assim

mysite/Controller/Action/21-9-2009 10:20/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top