none
Problemas com valores padrões para campos int e DateTime RRS feed

  • Pergunta

  • É o seguinte pessoal, eu tenho aqui uma classe simples POCO (acho que é assim que se chama):

     

    public class Usuario
    {
    public
    Int32 Codigo { get; set; } public String Nome { get; set; } public String Email { get; set; } public DateTime DataNascimento { get; set; }
    }

     

    Acontece que quando eu uso aqueles esquemas de criar View fortemente tipada e ela gera o código com aquele Html.TextBoxFor(model => model.Idade) por exemplo. O campo gerado fica com um valor padrão 0.

    Eu pesquisei e a melhor solução que encontrei foi trocar os campos INTs e DATETIMEs como nulos. Até ai funciona perfeitamente. Só que agora estou usando uma classe ORM gerada pelo Entity Framework. Qual seria a maneira mais certa de evitar esses valores padrões? Criando uma classe model view ou colocando substituindo as propriedades originais por propriedades do tipo nullable?


    terça-feira, 17 de maio de 2011 19:38

Respostas

  • Pode sim, hehe..

    Ou isso é coisa do MVC 3!? :S

    Enfim, é por causa disso que já esta aparecendo valores em tela, deixa o return em branco como eu falei,

    e o outro método para efetuar a gravação fica assim:

    [HttpPost]
    public ActionResult Create(Usuario usuario)
    {
      if (ModelState.IsValid){    
       db.Usuario.AddObject(usuario);
       db.SaveChanges();
       return RedirectToAction("Index"); 
      }
    }

     

     


    • Marcado como Resposta Tiago BR quarta-feira, 25 de maio de 2011 16:48
    quinta-feira, 19 de maio de 2011 21:03

Todas as Respostas

  • Não entendi direito o seu problema, poderia explicar melhor? Enquanto outros não respodem =p

    Vlws!

    quarta-feira, 18 de maio de 2011 18:57
  • quando eu crio uma View fortemente tipada a partir da classe acima, o campo que representa o Codigo fica com o valor 0 e o campo que representa a propriedade DataNascimento, fica com o valor 01/01/0001 01:01. O que eu queria é que este campos ficassem todos em branco quando eu fosse efetuar o cadastro de um novo registro
    quarta-feira, 18 de maio de 2011 23:31
  • Me mostra o código do método Create do seu Controller..

    O campo não precisa estar como nullable para funcionar isso que você quer.

    quinta-feira, 19 de maio de 2011 00:00
  • Kra.. é uma coisa comum que acontece no ASP.NET MVC

    observe por exemplo essa imagem do tutorial da nerddinner

    http://nerddinnerbook.s3.amazonaws.com/Images/image090.png

     

    Observe que ao efetuar um novo cadastro nesse formulario, os campos Evnet Date, Latitude, Longitude possuem valores ja preenchidos.

    O que eu quero é uma maneira de evitar isso

    quinta-feira, 19 de maio de 2011 13:37
  • Sim eu entendi, só achei estranho, aqui isso não ocorre, e eu não fiz nenhuma tratativa para isso.

    Você esta usando MVC3?

    Acredito que setando os campos como nullable vá funcionar, mas vamos ver se alguem não aparece com outra solução.

    No exemplo do Nerddinner isso ocorre porque olha como está o Controller dele:

        public ActionResult Create() {
    
          Dinner dinner = new Dinner() {
            EventDate = DateTime.Now.AddDays(7)
          };
    
          return View(new DinnerFormViewModel(dinner));
        } 

    Você também está retornando algo?

    O meu esta: return View();

    quinta-feira, 19 de maio de 2011 13:46
  • então no meu caso estou usando o MVC 2

    o meu metodo create está assim:

     public ActionResult Create() {

              return View(new Usuario());
     }

     mesmo assim a data fica com um valor padrão : 01/01/0001 00:00 e os campos ints com valores 0

     

    Colocar nullable resolve sim, mas eu fico pensando... se eu tiver usando Entity Framework, seria errado eu ir lá alterar a propriedade da classe para nullable, não?

    quinta-feira, 19 de maio de 2011 18:54
  • Sim, não rola alterar para nullable.

    Então, não entendi "mesmo assim a data fica com um valor padrão : 01/01/0001 00:00 e os campos ints com valores 0"

    Você testou com "return View();" ?

    quinta-feira, 19 de maio de 2011 19:02
  • É que assim... quando você instancia uma classe qualquer propriedade Int fica com o valor padrão 0 e propriedades DateTime ficam com o valor '01/01/0001 00:00:00'

    sempre que eu fizer um método create() no mvc, pelo que eu sei, eu tenho que retornar uma View e passar como parametro uma nova instancia da classe tipada dessa view... ou seja se eu tenho uma view fortemente tipada da classe usuário, no final do método Create() eu tenho que colocar um return View(new Usuario());

    eu num posso retornar uma View sem parametros.

    quinta-feira, 19 de maio de 2011 20:57
  • Pode sim, hehe..

    Ou isso é coisa do MVC 3!? :S

    Enfim, é por causa disso que já esta aparecendo valores em tela, deixa o return em branco como eu falei,

    e o outro método para efetuar a gravação fica assim:

    [HttpPost]
    public ActionResult Create(Usuario usuario)
    {
      if (ModelState.IsValid){    
       db.Usuario.AddObject(usuario);
       db.SaveChanges();
       return RedirectToAction("Index"); 
      }
    }

     

     


    • Marcado como Resposta Tiago BR quarta-feira, 25 de maio de 2011 16:48
    quinta-feira, 19 de maio de 2011 21:03
  • É que assim... quando você instancia uma classe qualquer propriedade Int fica com o valor padrão 0 e propriedades DateTime ficam com o valor '01/01/0001 00:00:00'

    sempre que eu fizer um método create() no mvc, pelo que eu sei, eu tenho que retornar uma View e passar como parametro uma nova instancia da classe tipada dessa view... ou seja se eu tenho uma view fortemente tipada da classe usuário, no final do método Create() eu tenho que colocar um return View(new Usuario());

    eu num posso retornar uma View sem parametros.

    Você pode sim retornar uma view vazia, não há obrigatoriedade de se retornar um objeto em uma view mesmo que ela seja fortemente tipada.

    Siga a sugestão do Gustavo e seu caso estará resolvido.

    sexta-feira, 20 de maio de 2011 23:23
    Moderador
  • é isso ai funcionou, valew pessoal =)
    quarta-feira, 25 de maio de 2011 16:48