none
Mvc4 RRS feed

Todas las respuestas

  • Los campos de la vista te llegan al controlador de varias maneras: puedes declarar un parámetro del método de acción por cada campo, o puedes usar un parámetro de tipo FormCollection, o puedes usar la colección Forms desde dentro del método de acción. Una vez que tienes todos los campos en variables, grábalas en las tablas que tú quieras mediante llamadas individuales a tu infraestructura favorita de acceso a datos, tales como un SqlCommand de ADO.NET, o Linq-to-SQL, o Entity Framework, o cualquier otro ORM que tengas instalado. No te obsesiones con seguir los tutoriales "simples" que usan una instancia del Modelo para salvar los datos. El Modelo que se usa para pasar datos del controlador a la Vista no tiene por qué coincidir con el Modelo de datos, aunque en los ejemplos más sencillos tiendan a hacerlo coincidir.
    martes, 2 de diciembre de 2014 18:16
  • Efectivamente lo que dice Alberto es correcto. Aún así, quiero darte una posibilidad adicional que es bastante común en este tipo de desarrollos.

    El típico caso de cabecera - detalle de una factura, pues como seguro lo tienes son dos entidades: Cabecera y Detalle. Pero está transacción se debería de manejar en una sola vista y lo que se quisiera es que esa vista reciba y envíe los datos de una factura (Cabecera y Detalle). No necesitas ceñirte al modelo que tiene las entidades Cabecera y Detalle por separado, sino que puedes crear tus propios ViewModels que son un contenedor de uno o varios modelos o propiedades. En este caso puedes crear el ViewModel Factura que contenga dentro  las entidades Cabecera  y Detalle, de tal manera que el controlador envía a la vista una entidad llamada Factura y la vista al hacer un POSTBACK envía al controlador una entidad Factura. Todo tipado.

    Espero haberte ayudado con tus dudas.


    martes, 2 de diciembre de 2014 18:25
  • hola

    creo que deberias explicarte un poco mejor

    AYUDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    por ejemplo como es la estructura de esta vista, se bindea a algun model con cierta estructura de datos

    imagino conoces ado.net para poder implementar INSERT sobre diferentes tablas, no? o usas entity framework

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 2 de diciembre de 2014 18:27
  • tengo  tres tablas ,-- datos principales--,-- pacientes-- , --usuarios--,
    primero tengo que guarda datos en la tabal -- datos princiales, y pasarle el ---id- a pacientes- y 
    guardar datos de pacientes- y luego pasarle el id del paciente a la tabla usaurios- y 
    lo quiero hacer  des una vista y con un solo controlador, la verda no se si se pue
    martes, 2 de diciembre de 2014 18:34
  • Claro que se puede.

    Create un ViewModel llamado por ejemplo GestionPacientes, el mismo que contendrá las entidades DatosPrincipales, Pacientes y usuarios. Ese ViewModel inicializado podrías mandarlo a la vista y la vista devolverá ese ViewModel al controlador (un sólo controlador) al hacer un postback. En el controlador desmenuzaras las propiedades del ViewModel e irás grabando en las tablas correspondientes.

    El ViewModel

    public class VieModelGestionPaciente
        {
            public List<DatoPrincipal> DatoPrincipal { get; set; }
            public List<Paciente> Paciente { get; set; }
            public List<Usuario> Usuario { get; set; }        
        }

    Y el controlador que recibe el viewmodel sería algo asi

    
    
    [HttpPost]
    public ActionResult Create(ViewModelGestionPaciente gestionPaciente)
    {
      DatoPrincipal datoPrincipal = new DatoPrincipal();  
    
      datoPrincipal.campo1 = gestionPaciente.campo1;
      datoPrincipal.campo2 = gestionPaciente.campo2;
      datoPrincipal.campo3 = gestionPaciente.campo3;
    
      db.DatoPrincipal.Add(datoPrincipal);
      db.SaveChanges();
    
      //Al grabar los datos datoPrincipal ya obtiene el id grabado en caso sea Indetity. Así prosigues con las demas tablas
    
      Paciente paciente = new Paciente();
      
      paciente.campo4 = gestionPaciente.campo4;
      paciente.datoprincipalId = datoPrincipal.Id; /*AQUI SE ASIGNA LA PK DE LA TABLA ANTERIOR*/
    
      db.Paciente.Add(paciente);
      db.SaveChanges();
    
      ...
    }
    
    Espero haberte ayudado.


    martes, 2 de diciembre de 2014 18:47
  • hola

    ese id que mencioans debes ir pasando acaso es un campo definido como identity ?

    que base de datos utilizas

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {  
        conn.Open();  
       
        int idTabla1 = 0;
        string query = "INSERT INTO NombreTabla (col1, col2) VALUES (@param1, @param2); SELECT SCOPE_IDENTITY()";  
        using(SqlCommand cmd = new SqlCommand(query, conn))  
        {  
            foreach (DataGridViewRow row in dataGridView1.Rows)  
            {  
                cmd.Parameters.Clear();  
     
                cmd.Parameters.AddWithValue("@param1", Convert.ToString(row.Cells("col1").Value));  
                cmd.Parameters.AddWithValue("@param2", Convert.ToInt32(row.Cells("col2").Value));  
     
                idTabla1 = Convert.ToInt32(cmd.ExecuteScalar());  
            } 
        }  
          
     
        string query2 = "INSERT INTO NombreTabla2 (campo1, campo2) VALUES (@param1, @param2)";  
        using(SqlCommand cmd = new SqlCommand(query2, conn))  
        {  
     
           cmd.Parameters.AddWithValue("@param1", textbox1.Text);  
           cmd.Parameters.AddWithValue("@param2", idTabla1);  
     
           cmd.ExecuteNonQuery();  
        }  
    }

    como veras recuperas el valor de un insert y se lo pasas a la siguiente insert

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 2 de diciembre de 2014 18:49