ASP.NET MVC - Как имена действий влияют на URL? - PullRequest
2 голосов
/ 02 сентября 2008

Используя MVC из коробки, я обнаружил, что сгенерированные URL могут вводить в заблуждение, и я хотел знать, можно ли это исправить или мой подход / понимание неверны.

Предположим, у меня есть страница CreateEgg, на которой есть форма, и как только форма заполнена и отправлена, пользователь попадает на страницу ListEggs с новым яйцом внутри.

Так что мой контроллер для яиц будет выглядеть примерно так:

public class EggController : Controller
{
    public void Add()
    {
        //do stuff

        RenderView("CreateEgg", viewData);
    }

    public void Create()
    {
        //do stuff

        RenderView("ListEggs", viewData);
    }
}

Так что моя первая страница будет иметь URL-адрес типа http://localhost/egg/add, а форма на странице будет иметь действие:

using (Html.Form<EggController>(c => c.Create())

То есть вторая страница будет иметь URL-адрес http://localhost/Egg/Create,. Это вводит в заблуждение, действие должно называться Create, потому что я создаю яйцо, но отображается список, поэтому URL-адрес http://localhost/Egg/List сделает больше сцены. Как мне добиться этого, не вводя в заблуждение мои представления или названия действий?

Ответы [ 3 ]

4 голосов
/ 02 сентября 2008

Проблема в том, что ваше действие совершает две вещи, нарушая принцип единой ответственности.

Если действие «Создать» перенаправляет на действие «Список» после завершения создания элемента, эта проблема исчезает.

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

ActionVerbs Обрисовано в общих чертах в сообщении Скотта Гу , похоже, хороший подход;

Скотт говорит:

Вы можете создать перегруженный реализации методов действия, и использовать новый атрибут [AcceptVerbs] для есть ASP.NET MVC фильтр, как они посланный. Например, ниже мы можем объявить два метода действий Create - тот, который будет вызываться в GET сценарии, и тот, который будет называться в сценариях POST

[AcceptVerbs("GET")]
public object Create() {}
[AcceptVerbs("POST")]
public object Create(string productName, Decimal unitPrice) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...