insertar datos usando la clase de modelo de vista

Aug 20 2020

Clase modelo ::

public class MappedModels
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int MappedId { get; set; }
        public int MappedType { get; set; }
        public decimal MappedAmount { get; set; }
        
        [ForeignKey("ProjectId")]
        public ProjectModels Project { get; set; } 
        public int ProjectId { get; set; }
    }

Ver clase de modelo ::

public class MappedViewModels
    {
        public int MappedType { get; set; }
        public decimal MappedAmount { get; set; }
        public int ProjectId { get; set; }
        public string ProjectName { get; set; }
        
        // these two fields only in MappedViewModels for calculation purpose
        public decimal ProjectAllocatedAmount { get; set; } 
        public decimal RemainingAmount { get; set; }  
}

He creado la Create.cshtmlpágina para MappedModelsusar MappedViewModels. Ahora, cuando intento enviar el formulario, aparece un error:

The model item passed into the dictionary is of type 'myapp.Models.MappedModels', but this dictionary requires a model item of type 'myapp.ViewModels.MappedViewModels'.

Mi método de controlador Create:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MappedId,MappedType,MappedAmount,ProjectId")] MappedModels mappedModels)
{
    if (ModelState.IsValid)
    {
        db.Mappeds.Add(mappedModels);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

Si cambio el método a public ActionResult Create( MappedViewModels mappedModels), aparece un error endb.Mappeds.Add(mappedModels)

Tengo que usar los campos de MappedViewModelsin public ActionResult Create(int? ProjectId).

Además, mi MappedViewModelsatributo no contiene MappedId, si lo mantengo allí (MappedViewModels) también cómo se MappedIdpuede incrementar automáticamente .

Entonces, ¿cómo insertar datos usando MappedViewModelsa MappedModels?

Como se sugiere en la solución que probé:

public ActionResult Create([Bind(Include = "MappedType,MappedAmount,ProjectId")] MappedViewModels model)
{
    if (ModelState.IsValid)
    {
        var dbMappedModel = new MappedModels
        {
          MappedType = model.MappedType,
          MappedAmount = model.MappedAmount,
          ProjectId = model.ProjectId
        }

        db.Mappeds.Add(dbMappedModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

Pero obteniendo un error Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.. Lo está causando debido a la clase Project donde hay varios campos obligatorios. ¡¡¡Por favor ayuda!!!

Respuestas

1 SowmyadharGourishetty Aug 20 2020 at 10:37

Actualice su lógica de acción como se muestra a continuación

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MappedType,MappedAmount,ProjectId")] MappedViewModels model)
{
    if (ModelState.IsValid)
    {
        // when you add to the context, create a new MappedModels object
        // You need not to worry about the MappedId, it will be auto incremented
        var dbMappedModel = new MappedModels
        {
          MappedType = model.MappedType,
          MappedAmount = = model.MappedAmount,
        
          Project = new ProjectModels { ... }
        }

        db.Mappeds.Add(dbMappedModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

¿Cuál es el uso de [Bind(Include = "MappedType,MappedAmount,ProjectId")]lo que no creo que se requiere. Yo nunca lo usé.