Publicación de múltiples formularios en MVC Razor View con un solo modelo de vista

Tengo una vista de la maquinilla de afeitar que contendrá 5 formas. (A B C D E). Cada uno de estos formularios tiene su propio ViewModel (AViewModel, BViewModel, CViewModel, DViewModel, EViewModel).

Creé un ProductViewModel padre que la página usará como único ViewModel. Dentro de este ViewModel estarán todos los otros ViewModels para cada formulario en la página (enumerados arriba).

Aquí es cómo se ven las propiedades de ProductViewModel:

public AViewModel { get; set; } public BViewModel { get; set; } public CViewModel { get; set; } public DViewModel { get; set; } public EViewModel { get; set; } 

Mi vista de maquinilla de afeitar se parece a la siguiente:

 @model MVCApp.ViewModels.ProductViewModel @{ ViewData["Title"] = "Product Detail"; } 

Product Detail

Form A


@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }

Cuando se hace clic en el botón Guardar, termino en el Método de acción Guardar (POST) del Controlador A, como es de esperar:

  [HttpPost] [ValidateAntiForgeryToken] public IActionResult Save(AViewModel viewModel) { return Ok(); } 

Sin embargo, noté que todas las propiedades del parámetro viewModel están vacías.

¿Esto significa que realmente tengo que pasar el objeto ProductViewModel como mi ViewModel al método de acción de guardar para los 5 de estos formularios donde solo se completará el ViewModel en el scope y todo lo demás será nulo? ¿O hay un mejor camino?

Sugiero hacer de cada formulario una vista parcial y pasar solo el submodelo necesario del modelo principal

  @{await Html.RenderPartialAsync("AViewPartial", Model.AViewModel); } 

entonces sus entradas en el parcial se pueden cambiar desde

  

a

  

lo que debería hacer que se vincule correctamente por el modelbinder para que pase a su acción

Su parámetro para el método POST debe ser ProductViewModel .

La razón de esto se debe a la forma en que se nombran las propiedades en su HTML:

  

El cuaderno de modelos toma su formulario serializado y ve que está enviando al método POST un valor para una propiedad llamada AViewModel.Name . Cuando su parámetro es de tipo AViewModel , no encuentra nada, porque está buscando la propiedad secundaria de su tipo de parámetro con un nombre de AViewModel , y luego asignando la propiedad Name ese objeto al valor de la entrada.

Si no desea que el parámetro de cada uno de sus métodos POST ProductViewModel , entonces tiene una alternativa principal: Cree vistas parciales para sus cinco formularios diferentes y pase las propiedades individuales de su modelo ProductViewModel como su modelo para la vista parcial. . Esto eliminará el prefijo de propiedad AViewModel de su atributo asp-for .