¿Cómo admitir múltiples formularios dirigidos a la misma acción Crear en la misma página?
-
29-09-2020 - |
Pregunta
Quiero tener dos formularios separados en una sola página de creación y una acción en el controlador para cada formulario.
En la vista:
<% using (Html.BeginForm()) { %>
// Contents of the first (EditorFor(Model.Product) form.
<input type="submit" />
<% } %>
<% using (Html.BeginForm()) { %>
// Contents of the second (generic input) form.
<input type="submit" />
<% } %>
En el controlador:
// Empty for GET request
public ActionResult Create() {
return View(new ProductViewModel("", new Product()));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Product product) {
return View(new ProductViewModel("", product));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(string genericInput) {
if (/* problems with the generic input */) {
ModelState.AddModelError("genericInput", "you donkey");
}
if (ModelState.IsValid) {
// Create a product from the generic input and add to database
return RedirectToAction("Details", "Products", new { id = product.ID });
}
return View(new ProductViewModel(genericInput, new Product()));
}
Resultados en "The current request for action 'MyMethod' on controller type 'MyController' is ambiguous between the following action methods"
- error o se llama a la acción Crear incorrecta.
¿Soluciones?
- Combine esas dos publicaciones Crear acciones en un público
ActionResult Create(Product product, string genericInput);
- Asigne un nombre diferente a una de las acciones POST Create y agregue el nuevo nombre a la acción correspondiente.
Html.BeginForm()
No tengo idea de cuáles son las advertencias en estos.Como resolverias esto?
Solución
En realidad, creo que puedes hacer esto si eres más específico con tu llamada a BeginForm().
Using(Html.BeginForm<ControllerName>(c => c.Create((Product)null)) { }
Using(Html.BeginForm<ControllerName>(c => c.Create((string)null)) { }
Otros consejos
No puedes tener dos acciones con el mismo nombre y verbo que difieran sólo en los tipos de argumento.En mi humilde opinión, sería una buena idea nombrar sus dos acciones de manera diferente, suponiendo que realizan diferentes tareas y reciben diferentes aportes.