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

StackOverflow https://stackoverflow.com/questions/47338

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Есть идеи?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Затем в вашем методе Удалить (идентификатор строки) укажите:

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@, мой домен, на моей информационной странице.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top