Маршрутизация ASP.NET MVC: Могу ли я иметь имя действия с косой чертой в нем?

2

Что я хочу сделать, это иметь страницу в /Products/Details/{id}, которая перенаправляет сведения о действиях на ProductsController, а также страницу редактирования в /Products/Details/Edit/{id}.

Я попытался сделать это, используя [ActionName("Details/Edit")] для действия, но это не работает.

  • 0
    Почему бы просто не назвать это EditDetails?
  • 0
    Потому что это не соответствует URL, который я пытаюсь достичь.
Теги:
asp.net-mvc
url
routing

3 ответа

5
Лучший ответ

У вас нет косой черты в имени вашего действия.

Почему бы не выполнить следующие действия?

  • /Продукты/Детали/{id} -Для отображения
  • /Продукты/Изменить/{id} -Для редактирования

Мое предпочтение было бы сделать следующее:

  • /Продукты/{id}/Просмотр -Для отображения
  • /Продукты/{id}/Редактировать/-Для редактирования

Надеюсь, что это имеет смысл!

  • 0
    потому что каждый продукт имеет несколько просмотров. Детали, история, документы и т. Д. Каждая из этих страниц должна быть представлена в форме просмотра и редактирования.
  • 1
    Однако мне нравится шаблон маршрутизации, который вы описываете. / Products / {id} / Details и / Products / {id} / Details / Edit будут вполне приемлемы.
Показать ещё 1 комментарий
1

Что вы можете сделать, так это. Установите новый маршрут, подобный этому, до маршрута по умолчанию;

 routes.MapRoute(
     "PRoute", 
     "{controller}/{action}/{action2}/{id}", 
     null   
 );

то в вашем контроллере Products есть действие, подобное этому, обратите внимание, что имена параметров соответствуют именам на маршруте.

public ActionResult Details(string action2, string id)
{
    switch (action2)
    {
        case "edit":
            // Do Something.
            return View("edit");
        case "view":
            // Do Something.
            return View("view");
       default :
            // Do Something.
            return View("bad-action-error");
    }
}

Теперь действие Details будет передано action2 и id из url. Таким образом, URL-адрес, например /products/details/view/ 7, получит действие "view" и "7", и вы можете использовать оператор switch или if на action2, чтобы продолжить обработку. Теперь это можно легко расширить, включив другие под-действия.

1

Добавьте маршрут, подобный этому ПЕРЕД по умолчанию:

routes.MapRoute(
    "DefaultWithDetails",
    "{controller}/Details/{action}/{id}"},
    null);
  • 0
    +1, чтобы сделать то, что просил JayArr, хотя я думаю, что семантически предложение Льюиса - лучшая идея.
  • 0
    Джеймс, да. Я согласен. Но я просто отвечал на вопрос :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню