Удалить действие не работает MVC 3 - PullRequest
1 голос
/ 18 февраля 2012

Маршрут, который я определил:

    map.Route(new Route("Cars/{id}/Delete",  
              new RouteValueDictionary(new { controller = "Car", action = "Delete"}),
              new MvcRouteHandler()));

На мой взгляд, у меня есть:

<a href="/Car/@Model.Id/Delete">Delete</a>

, который при запуске пытается отправить запрос на http://oursite/Car/122/Delete

Мое действие удаления в этом контроллере автомобиля выглядит следующим образом:

public ActionResult Delete(int id)
{
    //code is here
}

Я заметил пару вещей:

  1. Если я запускаю этот же код локально через мой ПК, удаление работает безупречно и может получить доступ к моему методу действия.Я запускаю это через IIS 7 / Win 7

  2. На нашем сервере разработки он, очевидно, настраивается через IIS7, но этот маршрут завершается ошибкой и говорит, что не может найти маршрут в нашей таблице маршрутов.,Но это тот же самый класс таблицы маршрутов, который я использую локально ... так почему я получаю это:

Ни один маршрут в таблице маршрутов не соответствует предоставленным значениям.

Но почему бы это не работать на сервере dev?Я вижу настройки, идентичные в IIS, по большей части, насколько я вижу, когда сравниваю свои локальные настройки с настройками сервера.

Я заметил, что это также локальный хост или сервер, если я пытаюсь поставить [HttpDelete] в моем действии удаления, он не находит мой метод действия, и я получаю сообщение об ошибке, в котором говорится, что не может найти этот метод.Поэтому не уверен, почему, когда я снимаю это, удаление работает (только localhost)

Ответы [ 5 ]

1 голос
/ 18 февраля 2012

Используйте помощника для генерации вашей ссылки:

@Html.ActionLink("Delete", "Delete", "Car");

Первый параметр - это текст вашей ссылки, второй - имя метода Action, а третий - имя вашего контроллера.

См. справочник MSDN по ActionLink () .

.
0 голосов
/ 18 февраля 2012

Вероятно, есть разница в путях URL между localhost и нашим сайтом. Путь "/Car/@Model.Id/Delete" жестко запрограммирован, не разрешен и может работать не во всех средах. Как предлагается в других ответах, используйте помощник MVC, например @ Html.ActionLink или @ Url.RouteUrl, чтобы определить путь для локальной среды.

0 голосов
/ 18 февраля 2012

Имя этого маршрута

map.Route("DeleteCar",new Route("Cars/{id}/Delete",  
          new RouteValueDictionary(new { controller = "Car", action = "Delete"}),
          new MvcRouteHandler()));

Тогда

<a href="@Url.RouteUrl("DeleteCar",new{id=Model.Id})">Delete</a>

Если эта ссылка не ведет на экран предупреждения, я настоятельно предлагаю, чтобы удаление было POST или даже DELETE (я думаю, что это может быть установлено через ajax)

0 голосов
/ 18 февраля 2012

Я думаю, что вы ответили на свой вопрос. В таблице маршрутов нет маршрутов, соответствующих указанным вами значениям. Вы можете написать этот маршрут для этого, написав это в файле Global.asax.cs:

public class Global : System.Web.HttpApplication
{
  protected void Application_Start()
  {
    // Specify routes
    RouteTable.Routes.Add(new Route
    {
      Url = "[controller]/[id]/[action]",
      Default = new { controller = "Car" },
      RouterHandler = typeof(MvcRouteHandler)
    });
  }
}

Или вы можете использовать существующие маршруты (моя личная рекомендация), чтобы использовать функцию удаления в контроллере вашего автомобиля. Чтобы сделать это, попробуйте переключить свой код на это:

<a href="/Car/Delete/@Model.Id">Delete</a>
0 голосов
/ 18 февраля 2012

Не могли бы вы поделиться кодом для просмотра. Как построить тег «a» в представлении?

Что касается атрибута [HttpDelete], это означает, что методу требуется HTTP-запрос DELETE. Тег 'a' всегда имеет запрос GET. Пожалуйста, обратитесь по этой ссылке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...