MVC4 игнорирует атрибуты [HttpGet] и [HttpPost]

Я пытаюсь создать простой тестовый веб-сайт, чтобы я мог перечислять, создавать, редактировать и удалять объекты клиентов с помощью MVC4.

Внутри моего контроллера у меня есть 2 метода создания: Get, когда форма загружается с элементами управления, и Post, который фактически сохраняет данные.

    //
    // GET: /Customer/Create

    [HttpGet]
    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Customer/Create

    [HttpPost]
    public ActionResult Create(Customer cust)
    {
        if (ModelState.IsValid)
        {
            _repository.Add(cust);
            return RedirectToAction("GetAllCustomers");
        }

        return View(cust);
    }

Однако, когда я запускаю проект и пытаюсь получить доступ к действию создания, я получаю сообщение об ошибке:

The current request for action 'Create' on controller type 'CustomerController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Create() on type [Project].Controllers.CustomerController
System.Web.Mvc.ActionResult Create([Project].Models.Customer) on type [Project].Controllers.CustomerController

Я понимаю, что он не видит разницы между моими методами Get и Post, но я добавил атрибуты. Что может быть причиной этого и как я могу заставить его работать снова?


person user1755802    schedule 18.10.2012    source источник
comment
попробуйте очистить и пересобрать проект.   -  person Vijayant Katyal    schedule 18.10.2012
comment
вам нужно либо добавить атрибут для перегрузки, либо атрибут для acceptverbs, см. этот заголовок stackoverflow.com/questions/436866/   -  person Zaki    schedule 18.10.2012
comment
этот код выглядит нормально - вы уверены, что получили эту ошибку после добавления атрибутов http?   -  person Mike Simmons    schedule 18.10.2012
comment
Да, я все еще получаю сообщение об ошибке после добавления атрибутов HTTP. Я также очистил и перестроил проект, как предложил @VijayantKatyal.   -  person user1755802    schedule 18.10.2012
comment
Не могли бы вы уточнить, как вы пытаетесь получить доступ к действию создания?   -  person Yakimych    schedule 18.10.2012
comment
Вы можете добавить неправильную библиотеку DLL веб-APi, пожалуйста, покажите using   -  person cuongle    schedule 18.10.2012
comment
@Yakimych Когда я говорю «доступ к действию создания», я имею в виду попытку доступа к странице в моем браузере localhost:64349/Customer/ Создать   -  person user1755802    schedule 18.10.2012
comment
Попробуйте переименовать имя метода действия POST, чтобы узнать, решает ли он вашу проблему. Если нет, значит, вы не используете последнюю версию кода на своем веб-сервере.   -  person Mike Simmons    schedule 18.10.2012
comment
@MikeSimmons Да, если я переименую действие публикации в CreatePost, то действие GET Create загрузится правильно.   -  person user1755802    schedule 18.10.2012
comment
а переименовать обратно опять начинает терпеть неудачу?   -  person Mike Simmons    schedule 18.10.2012
comment
если это так, можете ли вы проверить, на какую сборку ссылаются HttpGetAttribute и HttpPostAttribute? Должен быть System.Web.Mvc v4   -  person Mike Simmons    schedule 18.10.2012
comment
@CuongLe Вы правы, спасибо, сэр. Я использовал System.Web.Mvc; сидя за пределами моего пространства имен и используя System.Web.Http; сидит внутри моего пространства имен. Этот конфликт означал, что использовались атрибуты HTTP, а не атрибуты MVC. Спасибо и Майку Симмонсу.   -  person user1755802    schedule 18.10.2012


Ответы (1)


MVC не разрешает вам иметь 2 метода действий с одинаковыми именами.

НО у вас может быть 2 метода действия с одним и тем же URI, когда HTTP-глагол отличается (GET, POST). Используйте атрибут ActionName, чтобы задать имя действия. Не используйте одинаковые имена методов. Вы можете использовать любое имя. Соглашение состоит в том, чтобы добавить глагол http в качестве суффикса метода.

[HttpPost]
[ActionName("Create")]
public ActionResult CreatePost(Customer cust)
{
    if (ModelState.IsValid)
    {
        _repository.Add(cust);
        return RedirectToAction("GetAllCustomers");
    }

    return View(cust);
}
person Softlion    schedule 18.10.2012