MVC2 - Маршрут сопоставлен, но QueryString визуализирован - PullRequest
1 голос
/ 06 августа 2010

в моем приложении Asp.net MVC2 я зарегистрировал следующие маршруты в global.asax.cs:

routes.MapRoute(
     "Search",
     "Search/{action}/{category}/{query}/{page}",
     new { controller = "Search", action = "Results", category = "All", page = 1 },
     new { page = @"\d{1,8}" }
);



// URL: /Search
routes.MapRoute(
     "SearchDefault",
     "Search",
     new { controller = "Search", action="Index" }
);


routes.MapRoute(
    "Product",
    "Product/{action}/{productcode}",
    new { controller = "Product", action = "Details" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Search", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

У меня есть свой SearchController:

public ActionResult Results(string category, string query, int page)
{
}

У меня есть мой ProductController:

public ActionResult Details(string productcode)
{
    return View();
}

В моем представлении Results.aspx существуют следующие ссылки ActionLink:

<% foreach (var cat in Model.Categories) { %>
    <li><%= Html.ActionLink(cat.Name, "Results", "Search", new { category= cat.Name, query = Model.SearchText, page=1 }, null)%></li>
<% } %>
</ul>
<hr />
<table>
<% foreach (var p in Model.Products) { %>
    <tr>
        <td>
            <%= Html.ActionLink(p.ProductName, "Details", "Product", new { product = p.ProductCode }, new { })%><br />
        </td>
    </tr>   
 <% } %>

Первая ссылка действия отображается следующим образом:

"http://localhost/Search/Results?category=Test%20Category%20A&query=test%20product&page=1"

тогда как второй ActionLink правильно отображает:

"http://localhost/Product/Details/1234ABC020848"

Странно то, что оба работают правильно, и даже если я наберу вручную:

"http://localhost/Search/Results/Test%20Category%20A/test%20product/1"

тогда мой SearchController корректно выполняется. Я действительно предпочел бы иметь более чистый URL, представленный моим ActionLink. Что я пропустил?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 августа 2010

rout.MapRoute ("SearchDefault", "{controller} / {action} / {category} / {query} / {page}", new {}, new {controller = "Search", action ="Results"});

Это должно привести к тому, что вы получите вот такой URL (могут потребоваться некоторые дополнительные настройки)

http://localhost/Search/Results/Test%20Category%20A/test%20product/1

Игнорировать это ... Я не виделПервый маршрут в вопросе.

Обычно я предпочитаю использовать строку запроса для поиска, потому что, как только у вас есть два или более параметров, которые не требуются, маршруты для этого довольно трудны для создания и поддержки.*

0 голосов
/ 07 августа 2010

Поскольку у меня нет вашей модели, я удалил циклы foreach и заменил все неизвестные значения строками.В моих тестах я обнаружил противоположное поведение: первая ссылка была в порядке, а другая не была чище.Исправление для второй ссылки действия заключалось в замене «product» на «productcode».

<ul>
    <li><%= Html.ActionLink("Category", "Results", "Search", new { category= "Test Category A", query = "test product", page=2 }, null)%></li>
</ul>
<hr />
<table>
    <tr>
        <td>
            <%= Html.ActionLink("Product", "Details", "Product", new { productcode = "1234ABC020848" }, new { })%><br />
        </td>
    </tr>   
</table>

Предполагается, что оба способа работают, поскольку система маршрутизации отвечает за сопоставление переменных.

...