Как поддерживать несколько форм, предназначенных для одного и того же действия Создать на одной странице? - PullRequest
2 голосов
/ 25 июля 2010

Я хочу иметь две отдельные формы на одной странице создания и одно действие в контроллере для каждой формы.

По виду:

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

В контроллере:

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

Результат "The current request for action 'MyMethod' on controller type 'MyController' is ambiguous between the following action methods" - ошибка или неверное действие Создать.

Решения

  • Объедините эти два действия POST Create. в одну общедоступную ActionResult Create(Product product, string genericInput);
  • Назовите одно из действий POST Создать по-другому и добавьте новое имя к соответствующему Html.BeginForm()

Понятия не имею, каковы предостережения в них. Как бы вы решили это?

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

Вы не можете иметь два действия с одним и тем же именем и глаголом, которые отличаются только типами аргументов. ИМХО называть ваши два действия по-разному было бы хорошей идеей, если бы они выполняли разные задачи и принимали разные входные данные.

1 голос
/ 30 августа 2010

На самом деле, я полагаю, что вы можете сделать это, если вы более конкретны с вашим вызовом BeginForm ().

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