Wie unterstützt man mehrere Formulare, die auf dieselbe Aktion „Erstellen“ auf derselben Seite abzielen?

StackOverflow https://stackoverflow.com/questions/3330339

Frage

Ich möchte zwei separate Formulare auf einer einzelnen Erstellungsseite und eine Aktion im Controller für jedes Formular haben.

In der Ansicht:

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

Im Controller:

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

Ergebnisse in "The current request for action 'MyMethod' on controller type 'MyController' is ambiguous between the following action methods" - Fehler oder die falsche Create-Aktion wird aufgerufen.

Lösungen?

  • Kombinieren Sie diese beiden Beitrag, die Aktionen in einer Öffentlichkeit schaffen ActionResult Create(Product product, string genericInput);
  • Benennen Sie eine der POST Create-Aktionen anders und fügen Sie den neuen Namen dem entsprechenden hinzu Html.BeginForm()

Ich habe keine Ahnung, welche Vorbehalte darin bestehen.Wie würden Sie das lösen?

War es hilfreich?

Lösung

Tatsächlich glaube ich, dass Sie dies tun können, wenn Sie bei Ihrem BeginForm()-Aufruf genauer vorgehen.

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

Andere Tipps

Sie können nicht zwei Aktionen mit demselben Namen und Verb haben, die sich nur durch die Argumenttypen unterscheiden.Meiner Meinung nach wäre es eine gute Idee, Ihre beiden Aktionen unterschiedlich zu benennen, vorausgesetzt, sie führen unterschiedliche Aufgaben aus und nehmen unterschiedliche Eingaben entgegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top