ASP.NET MVC Preview 5 неоднозначность маршрутизации - PullRequest
1 голос
/ 06 сентября 2008

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

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

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

При поиске «Учетная запись / Удалить» или «Учетная запись / Удалить»? Username = davide ControllerActionInvoker выдает исключение, говорящее, что запрос на удаление неоднозначен между моими методами действий при буксировке.

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

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

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

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 06 сентября 2008

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

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

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

0 голосов
/ 22 декабря 2008

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

0 голосов
/ 08 сентября 2008

Что бы я сделал, это оставил бы пустым Delete () и использовал бы только Delete (строковое имя пользователя)

В вашей URL-маршрутизации у вас будет что-то похожее на "/ {Controller} / {Action} / {username} /"? Если у вас есть "/ {Controller} / {Action} / {Id} /", вам будет лучше выполнить Delete (идентификатор строки) и таким образом просто использовать 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 на моей информационной странице.

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

0 голосов
/ 06 сентября 2008

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

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

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