Неопределенность маршрутизации ASP.NET MVC Preview 5

Asked
Viewd733

1

У меня проблема с образцом маршрутизации в предварительном просмотре 5 asp.net mvc.

В AccountController у меня есть 2 действия:

 public ActionResult Delete()  
public ActionResult Delete(string username)
 

При попытке найти Account / Delete или Account / Delete? username = davide ControllerActionInvoker выдает исключение, в котором говорится, что запрос на удаление неоднозначен для моих методов действий с буксировкой.

Маршрут по умолчанию в global.asax не изменился.

Разве вызывающий действие не должен понимать, какой метод вызывать, просматривая список параметров?

Используя предварительную версию 4, у меня не было подобных проблем при выполнении той же операции.

Есть идеи?

4 ответов

3

Решение найдено!

С появлением атрибута ActionNameAttribute теперь необходимо вручную фильтровать, какой метод вызывать, в зависимости от запроса. Это делается с помощью атрибута ActionSelectionAttribute.

Полное объяснение здесь: http : //haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

0

Это неоднозначно, поскольку два действия контроллера являются одним и тем же методом публикации. Вы можете использовать это только в сценарии публикации формы, например, вы отправляете данные формы, которая использует сообщение HTTP.

0

Я не могу точно сказать, почему это происходит. Но вы можете рассмотреть возможность использования только действия Удалить (строковое имя пользователя) и удаления перегрузки без параметров.

Поскольку строка допускает значение NULL, я понимаю, что простой вызов Account / Delete вызовет действие с нулевым параметром имени пользователя, который затем можно проверить в начале метода действия.

0

Я бы отказался от пустого Delete () и использовал только Delete (строковое имя пользователя)

В маршрутизации URL-адресов должно быть что-то вроде "/ {Controller} / {Action} / {username} /"? Если у вас есть "/ {Controller} / {Action} / {Id} /", вам лучше выполнить Delete (string id) и, таким образом, просто использовать URL-адрес для обработки этого "/ Account / Delete / davide /"

При этом используйте маршрут по умолчанию, который должен быть чем-то вроде идентификатора по умолчанию ""

Затем в вашем методе Delete (string id) укажите:

 public ActionResult Delete(string id)
{
    if(string.IsNullOrEmpty(id)) return EmptyID();

    // Continue normal Delete method
}

public ActionResult EmptyID()
{
    // The method you were going to have on a blank delete.
}
 

Это или просто оберните его в один метод if {} else {}

В любом случае, я бы просто использовал один метод и использовал значение по умолчанию для вашего имени пользователя / идентификатора в вашем маршруте с пустой строкой и обрабатывал бы это таким образом.

Если вы хотите связаться со мной, чтобы обсудить то, что я имею в виду, или что-то еще поможет, напишите мне по адресу andrew @ my domain на моей информационной странице.

Редактировать: Во всяком случае, примерно то, что сказал Берко, я не уверен, как именованные атрибуты помогут - поэтому, пожалуйста, оставьте здесь комментарий, подробно описывая это для других парней, которые обнаруживают те же проблемы! :)