none
Duda a la hora de guardar una entidad en mi BBDD RRS feed

  • Pregunta


  • Buenas

    Les expongo una pequeña duda con la que me encuentro , para que me den su opinión sobre la mejor manera para resolverla.

    Muchas gracias de antemano

    Tengo mi entidad (resumida un poco, para no "colapsar"!!!! )

    public class cliente
       <key>
       public property  id as integer
       <required>
       public property nombre as string
       public property dni as string
       <required>
       public property mail as string
    End class


    Supongamos que he almacenado en mi BBDD  con anterioridad

     _repoClientes.Insert(new cliente with {
    	.id = 1, 
    	nombre = "Carlos O. M.", 
    	.dni = "12345678Z", 
    	.email = "colivam@hotmail.com"
    })
    


    La acción editar en el Controlador Clientes (p.E).

     Function Edit(Optional ByVal id As Long = Nothing) As ActionResult
                Dim cliente As Cliente = _repoClientes.Find(Function(c) c.Id = id).FirstOrDefault
                If IsNothing(cliente) Then
                    Return HttpNotFound()
                End If           
                Return View(cliente)
    End Function

    La vista editar - Digamos que solo quiero editar / modificar el campo del Correo Electrónico... NADA MAS...

    @ModelType Cliente
    
    @Code
        ViewData("Title") = "Editar Cliente"
    End Code
    
    @Using Html.BeginForm("Edit", "Clientes")
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(True)
    
        @If Model IsNot Nothing Then
            @Html.HiddenFor(Function(c) c.Id)
        End If
        @Html.LabelFor(Function(m) m.Email)
        @Html.TextBoxFor(Function(m) m.Email)
        <input type="submit" value="Guardar" />
    End Using
    
    @Section Scripts
        @Scripts.Render("~/bundles/jqueryval")
        <script src="@Url.Content("~/Scripts/jquery.validate.extra.js")" type="text/javascript"></script>
    End Section
    

    Cuando recibo el POST de la vista 

    <HttpPost()> _
    <ValidateAntiForgeryToken()> _
    Function Edit(ByVal cliente As Cliente) As ActionResult
                If ModelState.IsValid Then               
                    _repoClientes.Update(cliente)
                    _uow.Commit()
                    Return RedirectToAction("Index")
                End If
                Return View(cliente)
    End Function

    El ModelState es INVALIDO siempre.

    Entiendo que es porque, al no estar todos los campos de la entidad en la VISTA, los que están ausentes no se pueden Bindear con el modelo que recibe la función Edit, pero...Esta es la pregunta (por fin!!!!) 

    De que manera es mejor hacerla???? 

    * Tira de campos ocultos en la Vista?????

    * En lugar de utilizar la entidad como parámetro de la acción edit, utilizar un FormCollection??

    Function Edit(ByVal form As formcollection) As ActionResult


    O solo los campos que de la entidad que me interesa?? 

    Function Edit(ByVal ID as integer, ByVal email as String) As ActionResult

    Muchas gracias por todo. 

    lunes, 8 de abril de 2013 13:38

Todas las respuestas

  • hola

    sino entendi mal creo que el problema surge porque cuando defines la entidad de tu modelo y le pones por ejemplo

      <required>
       public property nombre as string

    le indicas a la validaicon que el nombre es requerido, peor no estas mostrando el nombre

    que pasa si quitas ese atributo Required de esa propiedad ? valida si asi funciona

    cuando la pagina sale por invalido no se muestra en el validation summary la desipcion de porque fallo ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 8 de abril de 2013 18:32
  • Buenos dias Leadro.

    No es este mi problema exactamente.

    (ATENCION.. PARRAFADA :) )

    Tengo en la BBDD, tal y como indico, un registro con los siguientes datos

    {id = 1, nombre = "Carlos O. M.", dni = "12345678Z", email = "colivam@hotmail.com" }

    Este registro lo envio a mi vista, pero solo "represento", los campos id y email.

    Cuando envio los datos del formulario al controlador, los datos que llegan son los siguientes

    {id = 1, nombre = nothing , dni = nothing , email = "colivam@hotmail.com" }

    Entiendo que me llegen estos valores, porque los campos nombre y dni, no los "pido" en la vista.

    Aquie es cuando viene mi duda, para ver que es mejor utilizar...

    Campos ocultos en la vista para las propiedades nombre y dni.

    Recoger desde el controlador un FormCollection

    Function Edit(ByVal form As formcollection) As ActionResult

    Recoger desde el controlador unicamente las propiedades ID y Nombre

    Function Edit(ByVal ID as integer, ByVal email as String) As ActionResult

    Muchas gracias.

    martes, 9 de abril de 2013 7:51
  • Buenos dias Leandro

    Buscando por ahi... he encontrado el siguiente procedimiento, que funciona de lujo.

    Function Editar(ByVal id As Long, ByVal values As FormCollection) As ActionResult            
                Dim cliente As Cliente = _repoClientes.Find(Function(c) c.Id = id).FirstOrDefault
                If TryUpdateModel(Of Cliente)(cliente, values) Then
                    _repoClientes.Update(cliente)
                    _uow.Commit()
                    Return RedirectToAction("Index")
                End If            
                Return View(cliente)
            End Function

    Corrigeme si me equivoco, pero con la function TryUpdateModel, unicamente se actualizan las propiedades del modelo que han cambiado, comparandolas con los campos que vienen en el FormCollection, el resto, no los "toca".

    Entiendo que esta es una buena opcion... no obstante, existen mas maneras????

    Muchas gracias. .

    martes, 9 de abril de 2013 8:14
  • Hola Carlos.

    Yo así a bote pronto, en vez de recoger el modelo entero en el método POST, recogería sólo el valor del email y el id. Con ese id obtendría los datos del modelo desde la BBDD, actualizaría el email y sincronizaría con la BBDD.

    De todas formas, date cuenta que puedes tener sobreescrituras del método, con lo que puedes mantener un método con el modelo como parámetro y otro método con el id y el email.


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"
    MCTS | SharePoint 2010, Application Development
    MCTS | SharePoint 2010, Configuring
    MS | Programming in HTML5 with JavaScript and CSS3 (MS)
    Twitter | @saintwukong

    martes, 9 de abril de 2013 8:18
  • Muchas Gracias Santiago

    Esa es otra alternativa que tenia en cuenta, y que planteo  en la propia pregunta..

    Function Edit(ByVal ID as integer, ByVal email as String) As ActionResult

    Mas que nada.. mi duda surge a raiz de mi "poca experiencia", para que me aconsejen cual seria el mejor metodo para realizarlo..

    martes, 9 de abril de 2013 10:19
  • Correcto, eso mismo te vale y así directamente se hace la validación de los campos y si el día de mañana quieres añadir la edición de un nuevo campo a la vista no tendrías que cambiar el método.

     


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"
    MCTS | SharePoint 2010, Application Development
    MCTS | SharePoint 2010, Configuring
    MS | Programming in HTML5 with JavaScript and CSS3 (MS)
    Twitter | @saintwukong

    martes, 9 de abril de 2013 10:24