none
Problemas con DateTimPicker RRS feed

  • Pregunta

  • Saludos,les comento que estoy trabajando con DateTimePicker, pero tengo un problema, que al hacer el post el valor que me envia es

    {01/01/0001 0:00:00} y entonces me da problemas en la Base de datos. como puedo hacer para que me traiga el valor seleccionado del DateTimePicker?

    martes, 30 de octubre de 2012 2:14

Respuestas

  • Acabo de hacer la prueba en Visual Studio 2012, MVC4 y funciona según lo esperado.  Le detallo lo que tengo:

    • Un proyecto nuevo Mvc Application llamado MvcApplication1.
    • Una clase Pais en la carpeta Models.
    • Una clase Persona en la carpeta Models.
    • Una clase PersonaFisica en la carpeta Models que hereda de Persona.
    • Un formulario simple con un textbox para la fecha de nacimiento de la persona física (ver adelante) en el View de Home/Index.  La vista especifica el tipo del modelo (strongly-typed view).
    • Una acción llamada Prueba que recibe como parámetro un objeto tipo PersonaFisica.
    • Un view para Prueba que lista las propiedades de PersonaFisica.

    En código sería como lo detallo.

    Index.cshtml:

    @model MvcApplication1.Models.PersonaFisica
    <!-- Luego todo lo demás que viene en el view por defecto que no lo pongo porque no interesa. -->
    ...
    @using (Html.BeginForm("Prueba", "Home", FormMethod.Post))
    {
        @Html.EditorFor(m => m.FechaNacimiento)
        <input type="submit" value="Click this" />
    }

    Prueba.cshtml:

    @model MvcApplication1.Models.PersonaFisica
    
    @{
        ViewBag.Title = "Prueba";
    }
    
    <h2>Prueba</h2>
    
    <fieldset>
        <legend>PersonaFisica</legend>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.Nombre)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Nombre)
        </div>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.Apellido)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Apellido)
        </div>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.FechaNacimiento)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.FechaNacimiento)
        </div>
    </fieldset>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </p>
    

    Luego en el HomeController:

            [HttpPost]
            public ActionResult Prueba(Models.PersonaFisica p)
            {
                return View(p); // Si pongo un punto de interrupción aquí, veo que p.FechaNacimiento viene con el valor que digito en el view.
            }
    

    Finalmente, los modelos:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace MvcApplication1.Models
    {
        public class Pais
        {
            public int ID { get; set; }
            public string Nombre { get; set; }
        }
        public class Persona
        {
            public int ID { get; set; }
            public Pais Pais { get; set; }
        }
        public class PersonaFisica : Persona
        {
            public string Nombre { get; set; }
            public string Apellido { get; set; }
            public DateTime? FechaNacimiento { get; set; }
        }
    }

    El view Prueba.cshtml muestra la fecha que introduzco en el formulario que pongo en Index.cshtml sin problema.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Christian.9 miércoles, 31 de octubre de 2012 19:48
    martes, 30 de octubre de 2012 2:55
  • Yo veo algo raro ahí...

    En la vista:

    <td>@Html.TextBoxFor(model => model.FechaDeNacimiento)</td>

    La propiedad se llama FechaDeNacimiento

    Pero luego en el controlador recibe suna "PersonaFisica" y la propiedad se llama "FechaNacimiento" (sin el De).

    Cual es el tipo del modelo de la vista (directiva @model)? Seguro que es un "PersonaFisica"? Si no lo es, en el controlador debes recibir como parámetro un objeto del mismo tipo que la vista.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Christian.9 miércoles, 31 de octubre de 2012 19:48
    martes, 30 de octubre de 2012 8:21

Todas las respuestas

  • La casilla de texto debe tener un atributo name igual al nombre de alguna propiedad del modelo o bien de algún parámetro de la acción del controlador.

    Jose R. MCP
    Code Samples

    martes, 30 de octubre de 2012 2:17
  • Pues el texto esta de esta forma

    <td>@Html.TextBoxFor(model => model.FechaDeNacimiento)</td>

    y en el controlador lo capturo de esta forma

    [

    HttpPost]

           

    publicActionResultPersona(PersonaFisicapPersonaFisica)

            {

               

    PersonaFisica_pPersonaFisica = newPersonaFisica


                {

                    FechaNacimiento = pPersonaFisica.FechaNacimiento             

                };

    martes, 30 de octubre de 2012 2:23
  • ¿Por qué instancia un objeto tipo PersonaFisica?  Si el controlador exige una instancia como parámetro, ASP.net MVC la creará y la llenará automáticamente con los valores que vienen en el request.  Eso de crear una nueva instancia simplemente borra lo que el motor ASP.net MVC hace.

    Jose R. MCP
    Code Samples

    martes, 30 de octubre de 2012 2:26
  • Lo que pasa que es un proyecto n-layer y estoy trabajando con polimorfismo por herencia, entonces hasta el momento es la foma en la que he podido trabajarlo. lo trabaje en un proyecto de prueba, de la forma que tu me dices, pero igual, sigo teniendo el mismo resultado con el DateTimPicker
    martes, 30 de octubre de 2012 2:29
  • Acabo de hacer la prueba en Visual Studio 2012, MVC4 y funciona según lo esperado.  Le detallo lo que tengo:

    • Un proyecto nuevo Mvc Application llamado MvcApplication1.
    • Una clase Pais en la carpeta Models.
    • Una clase Persona en la carpeta Models.
    • Una clase PersonaFisica en la carpeta Models que hereda de Persona.
    • Un formulario simple con un textbox para la fecha de nacimiento de la persona física (ver adelante) en el View de Home/Index.  La vista especifica el tipo del modelo (strongly-typed view).
    • Una acción llamada Prueba que recibe como parámetro un objeto tipo PersonaFisica.
    • Un view para Prueba que lista las propiedades de PersonaFisica.

    En código sería como lo detallo.

    Index.cshtml:

    @model MvcApplication1.Models.PersonaFisica
    <!-- Luego todo lo demás que viene en el view por defecto que no lo pongo porque no interesa. -->
    ...
    @using (Html.BeginForm("Prueba", "Home", FormMethod.Post))
    {
        @Html.EditorFor(m => m.FechaNacimiento)
        <input type="submit" value="Click this" />
    }

    Prueba.cshtml:

    @model MvcApplication1.Models.PersonaFisica
    
    @{
        ViewBag.Title = "Prueba";
    }
    
    <h2>Prueba</h2>
    
    <fieldset>
        <legend>PersonaFisica</legend>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.Nombre)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Nombre)
        </div>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.Apellido)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.Apellido)
        </div>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.FechaNacimiento)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.FechaNacimiento)
        </div>
    </fieldset>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </p>
    

    Luego en el HomeController:

            [HttpPost]
            public ActionResult Prueba(Models.PersonaFisica p)
            {
                return View(p); // Si pongo un punto de interrupción aquí, veo que p.FechaNacimiento viene con el valor que digito en el view.
            }
    

    Finalmente, los modelos:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace MvcApplication1.Models
    {
        public class Pais
        {
            public int ID { get; set; }
            public string Nombre { get; set; }
        }
        public class Persona
        {
            public int ID { get; set; }
            public Pais Pais { get; set; }
        }
        public class PersonaFisica : Persona
        {
            public string Nombre { get; set; }
            public string Apellido { get; set; }
            public DateTime? FechaNacimiento { get; set; }
        }
    }

    El view Prueba.cshtml muestra la fecha que introduzco en el formulario que pongo en Index.cshtml sin problema.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Christian.9 miércoles, 31 de octubre de 2012 19:48
    martes, 30 de octubre de 2012 2:55
  • Yo veo algo raro ahí...

    En la vista:

    <td>@Html.TextBoxFor(model => model.FechaDeNacimiento)</td>

    La propiedad se llama FechaDeNacimiento

    Pero luego en el controlador recibe suna "PersonaFisica" y la propiedad se llama "FechaNacimiento" (sin el De).

    Cual es el tipo del modelo de la vista (directiva @model)? Seguro que es un "PersonaFisica"? Si no lo es, en el controlador debes recibir como parámetro un objeto del mismo tipo que la vista.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Christian.9 miércoles, 31 de octubre de 2012 19:48
    martes, 30 de octubre de 2012 8:21
  • muchas gracias eduard tomas y webjose, ambos particiaron el parte de la solucion,
    miércoles, 31 de octubre de 2012 19:50