ASP.NET MVC Preview 4 - остановите Url.RouteUrl () и т. Д., Используя существующие параметры - PullRequest
5 голосов
/ 08 сентября 2008

У меня есть такое действие:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}

С таким маршрутом:

routes.MapRoute(
           "News-Archive",                                              
           "News.mvc/Archive/{year}",                           
           new { controller = "News", action = "Archive" }
       );

URL-адрес, по которому я нахожусь:

News.mvc/Archive/2008

У меня есть форма на этой странице, подобная этой:

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>

Отправка формы должна быть на News.mvc / Archive / 2007, если в форме выбран «2007».

Для этого требуется, чтобы атрибут формы 'action' был "News.mvc / Archive".

Однако, если я объявлю форму, подобную этой:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

отображается как:

<form method="get" action="/News.mvc/Archive/2008">

Может кто-нибудь, пожалуйста, дайте мне знать, что мне не хватает?

Ответы [ 3 ]

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

Думаю, у вас есть пара проблем.

Во-первых, ваш маршрут не имеет значения по умолчанию для "года", поэтому URL "/News.mvc/Archive" фактически недопустим для целей маршрутизации.

Во-вторых, вы ожидаете, что значения формы будут отображаться в качестве параметров маршрута, но HTML работает не так. Если вы используете простую форму с выбором и отправкой, ваши URL-адреса в конце будут иметь «? Year = 2007». Вот как формы GET-метода предназначены для работы в HTML.

Так что вам нужно прийти к какому-то заключению о том, что важно.

  • Если вы хотите, чтобы пользователь мог выбрать что-то из выпадающего списка, и это изменяет URL-адрес отправки, вам придется использовать Javascript для этого (перехватывая отправку формы и формулируя правильный URL-адрес).
  • Если вы согласны с /News.mvc/Archive?year=2007 в качестве URL-адреса, вам следует полностью удалить указатель {year} из маршрута. Вы все еще можете оставить параметр «int year» в своем действии, поскольку значения формы также будут заполнять параметры метода действия.
0 голосов
/ 08 сентября 2008

Решение

Хорошо, вот решение, (спасибо Брэду за то, что он привел меня туда).

1) Требовать значение по умолчанию в маршруте:

routes.MapRoute(
       "News-Archive",                                              
       "News.mvc/Archive/{year}",                           
       new { controller = "News", action = "Archive", year = 0 }
   );

2) Добавить перенаправление для анализа параметров GET, как будто они являются сегментами URL.

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
}

3) Убедитесь, что у вас есть код перенаправления для параметров запроса до любого кода для перенаправления записей года по умолчанию. т.е.

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
   if (year == 0)
   {
       /* ... */
   }
   /* ... */
}

3) Явно укажите значение по умолчанию для года в вызове Url.RouteUrl ():

Url.RouteUrl("News-Archive", new { year = 0 })
0 голосов
/ 08 сентября 2008

Я думаю, я понял, почему - маршрут включает {год}, поэтому сгенерированные маршруты всегда будут тоже.

Если кто-нибудь может это подтвердить?

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