O Asp.net-MVC agora permite a ligação implícita de objetos DateTime. Eu tenho uma ação ao longo das linhas de
public ActionResult DoSomething(DateTime startDate)
{
...
}
Isso converte com êxito uma sequência de caracteres de uma chamada ajax em um DateTime. No entanto, usamos o formato de data dd / MM / aaaa; O MVC está convertendo para MM / dd / aaaa. Por exemplo, ao enviar uma chamada para a ação com a string '09 / 02/2009 'resulta em um DateTime de '02 / 09/2009 00:00:00' ou 2 de setembro em nossas configurações locais.
Eu não quero rolar meu próprio fichário de modelo por causa de um formato de data. Mas parece desnecessário alterar a ação para aceitar uma string e usar DateTime.Parse se o MVC for capaz de fazer isso por mim.
Existe alguma maneira de alterar o formato da data usado no fichário do modelo padrão para DateTime? O fichário de modelo padrão não deveria usar suas configurações de localização?
fonte
Respostas:
Acabei de encontrar a resposta para isso com um pouco mais de pesquisa exaustiva:
Melvyn Harbour tem uma explicação completa do motivo pelo qual o MVC trabalha com datas do jeito que funciona e como você pode substituí-lo, se necessário:
http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx
fonte
MM/dd/yyyy
formato; caso contrário, mostra erro de validação.The field BeginDate must be a date.
Como posso fazer com que o sever aceite odd/MM/yyyy
formato?Eu definiria globalmente suas culturas. ModelBinder pegue isso!
Ou você apenas altera isso nesta página.
Mas globalmente no web.config acho melhor
fonte
Estou tendo o mesmo problema com a ligação de formato de data curta às propriedades do modelo DateTime. Depois de analisar muitos exemplos diferentes (não apenas sobre o DateTime), montei o seguinte:
Para manter a maneira como as rotas etc. são registradas no arquivo Global ASAX, também adicionei uma nova classe sintática à pasta App_Start do meu projeto MVC4 chamado CustomModelBinderConfig:
Depois, chamo o RegisterCustomModelBinders estático do meu Global ASASX Application_Start assim:
Uma observação importante aqui é que, se você escrever um valor DateTime em um campo oculto como este:
Eu fiz isso e o valor real na página estava no formato "MM / dd / aaaa hh: mm: ss tt" em vez de "dd / MM / aaaa hh: mm: ss tt" como eu queria. Isso fez com que a validação do meu modelo falhasse ou retornasse a data errada (obviamente trocando os valores de dia e mês).
Depois de muito esforço e tentativas fracassadas, a solução foi definir as informações de cultura para cada solicitação, fazendo isso no Global.ASAX:
Não funcionará se você o colar no Application_Start ou mesmo no Session_Start, pois isso o atribui ao thread atual da sessão. Como você bem sabe, os aplicativos da Web são sem estado, portanto, o encadeamento que atendeu sua solicitação anteriormente não é o mesmo encadeamento que atende à sua solicitação atual, portanto, suas informações de cultura foram para o grande GC no céu digital.
Agradecimentos: Ivan Zlatev - http://ivanz.com/2010/11/03/custom-model-binding-using-imodelbinder-in-asp-net-mvc-two-gotchas/
garik - https://stackoverflow.com/a/2468447/578208
Dmitry - https://stackoverflow.com/a/11903896/578208
fonte
Vai ser um pouco diferente no MVC 3.
Suponha que tenhamos um controlador e uma visão com o método Get
Devemos adicionar o ModelBinder
e o comando em Application_Start () do Global.asax
fonte
IModelBinder
, principalmente em relação à validação. Além disso, ele só funciona se o nome doDateTime
for dateTime .DateTime?
só funciona se você adicionar outra chamada aModelBinders.Binders.Add
withtypeof(DateTime?)
.Também é importante notar que, mesmo sem criar seu próprio fichário de modelo, vários formatos diferentes podem ser analisados.
Por exemplo, nos EUA, todas as seguintes strings são equivalentes e são automaticamente vinculadas ao mesmo valor DateTime:
Eu sugiro usar o aaaa-mm-dd, porque é muito mais portátil. Você realmente não quer lidar com o manuseio de vários formatos localizados. Se alguém reservar um voo em 1º de maio, em vez de 5 de janeiro, você terá grandes problemas!
NB: Não estou claro exatamente se aaaa-mm-dd é universalmente analisado em todas as culturas, então talvez alguém que conheça possa adicionar um comentário.
fonte
Tente usar toISOString (). Retorna string no formato ISO8601.
Método GET
javascript
c #
Método POST
javascript
c #
fonte
Defino a configuração abaixo no meu MVC4 e funciona como um encanto
fonte
fonte
fonte
Defino
CurrentCulture
eCurrentUICulture
meu controlador base personalizadofonte