Ошибка с ViewResult и ActionResult, содержащими одинаковые параметры - PullRequest
4 голосов
/ 15 января 2011

В моем контроллере у меня есть метод Edit GET для отображения вида и метод Edit POST для сохранения изменений:

public ViewResult Edit(int id)
{
    //
}

[HttpPost]
public ActionResult Edit(int id)
{
    //
}

Но я получаю сообщение об ошибке:

Тип 'Controllers.MyController' уже определяет член с именем 'Edit' с теми же типами параметров

Как мне обойти это?

Ответы [ 7 ]

5 голосов
/ 15 января 2011

Вы можете реализовать модели представлений, чтобы у вас была EditViewModel, содержащая все поля, которые вы хотите, чтобы пользователь мог редактировать, и возвращать их в вашем методе Edit GET и иметь строго типизированное представление модели представления.Тогда это означает, что в вашем методе POST вы передадите EditViewModel в качестве параметра, примерно так:

[HttpGet]
public ViewResult Edit(int id)
{
    //build and populate view model
    var viewModel = new EditViewModel();
    viewModel.Id = id;
    viewModel.Name = //go off to populate fields

    return View("", viewModel)
}

[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
    //use data from viewModel and save in database
}

И поэтому ваши методы GET и POST будут иметь разные сигнатуры.Надеюсь, это поможет.

3 голосов
/ 15 января 2011

Вы должны прочитать это ( 3.6 Подписи и перегрузка ) о перегрузке функции.

Функция перегрузки

При таком подходе вы можете иметь две или более функции с одинаковым именем. Но каждая функция должна иметь разные подпись (то есть разные типы параметр, последовательность параметров или количество параметров).

Примечание: тип возвращаемого значения не является сигнатурой параметра

В вашем коде вы также реализовали обе функции с одинаковыми именами и подписями.

2 голосов
/ 22 марта 2012

Для другого, менее изящного решения, представьте сайт с «Wizard-подобной» структурой страниц (Views), где вы хотите передать ViewModel со страницы 1 на страницу 2, со страницы 2 на страницу 3 и т. Д.

Проблема в том, что версия "GET" на странице 2 должна получать модель со страницы 1, но также должна передавать модель на страницу 3 при выполнении обратной передачи.Поэтому обе версии GET и POST любых «средних» страниц нуждаются в подписи, содержащей модель.

Обходной путь - просто добавить «параметр мусора» в подпись, убедившись, что он может быть обнуляем, используя?.

    [HttpGet]
    public ActionResult Page2(MyModel myModel)
    {
    }

    [HttpPost]
    public ActionResult Page2(MyModel myModel, int? i)
    {
    }
1 голос
/ 15 января 2011

Это потому, что вы передаете один и тот же параметр обеим функциям, что запрещено, хотя вы указываете HttpPost для одной.Вы можете изменить имя функции Edit Post и указать его в Html.BeginForm () или изменить параметр на FormCollection вместо int

0 голосов
/ 12 марта 2014

Вы можете попробовать это вместо этого.

    public ActionResult Edit()
    {
        return View();
    }

    [HttpPost]
    [ActionName("Edit")]
    public ActionResult EditPosted()
    {
        return View();
    }
0 голосов
/ 26 февраля 2013

Если вы используете View Model в своем методе POST-контроллера, убедитесь, что в вашей модели есть пустой конструктор.Это сводило меня с ума.

namespace app.Models
{
    public class UserEdit
    {
        public User User { get; set; }

        public UserEdit() { }
    }
}
0 голосов
/ 22 марта 2012

Думаю, самый простой способ сделать это - добавить дополнительный необязательный параметр в файл global.asax.cs:

new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional } // Parameter defaults

и измените вторую функцию с

[HttpPost]
public ActionResult Edit(int id)

до

[HttpPost]
public ActionResult Edit(int id, int id2)

Таким образом, вам не нужно менять свою логику. В качестве второго параметра необязательно. Он не будет жаловаться, если вы не предоставите значение.

...