2010-07-25 16 views
2

Je veux avoir deux formulaires distincts sur une seule page de création et une action dans le contrôleur pour chaque formulaire.Comment prendre en charge plusieurs formulaires qui ciblent le même Créer une action sur la même page?

De l'avis:

<% 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" /> 
<% } %> 

Dans le contrôleur:

// 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())); 
} 

Résultats dans "The current request for action 'MyMethod' on controller type 'MyController' is ambiguous between the following action methods" - erreur ou la mauvaise action Créer est appelée.

Solutions?

  • Combiner ces deux POST Créer des actions en public un ActionResult Create(Product product, string genericInput);
  • Nom un des POST Créer des actions différemment et ajouter le nouveau nom correspondant Html.BeginForm()

Je ne sais pas quelles sont les mises en garde dans ceux-ci. Comment résoudriez-vous cela?

Répondre

1

En fait, je crois que vous pouvez le faire si vous êtes plus précis avec votre appel BeginForm().

Using(Html.BeginForm<ControllerName>(c => c.Create((Product)null)) { } 
Using(Html.BeginForm<ControllerName>(c => c.Create((string)null)) { } 
+0

Hey! Merci pour l'info. Malheureusement, je n'ai pas réussi à trouver une version générique 'Html.BeginForm ' de la méthode d'extension 'Html.BeginForm'. Pourriez-vous me dire où je peux trouver cette extension? J'ai essayé les deux, MVC 2 et 3. – randomguy

+0

MVC Futures. Vous pouvez le trouver à http://aspnet.codeplex.com/releases/view/41742 – ARM

3

Vous ne pouvez pas avoir deux actions avec le même nom et le même verbe qui diffèrent uniquement avec les types d'argument. IMHO nommer vos deux actions différemment serait une bonne idée en supposant qu'ils effectuent des tâches différentes et prennent des intrants différents.