ASP.NET MVC Preview 5: неоднозначность маршрутизации
-
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.