Форма поиска Redirect Loop MVC3 с использованием HttpGet - PullRequest
2 голосов
/ 12 января 2012

надеюсь, что кто-то может помочь, потому что я ломал себе голову большую часть вчерашнего вечера! По сути, я пытаюсь заставить форму поиска работать с использованием HttpGet, чтобы потенциально получить результаты из внешнего источника по URL-адресу, например:

http://url.com/Area/Controller/Action/SearchCategory/SearchCriteria

Я создаю и передаю модель моему представлению, содержащему два свойства для SearchCategory и SearchCriteria , и в представлении отображаются соответствующие элементы управления HTML. Это прекрасно работает, если я выберу категорию и введу что-то по моим критериям. Однако, если я ничего не ввожу в свои критерии, я получаю бесконечное перенаправление. Мой маршрут для этой конкретной функции выглядит следующим образом:

context.MapRoute(
    "Dashboard-Search",
    "Area/Controller/Action/{SearchCategory}/{SearchCriteria}",
    new { 
        controller = "Controller", 
        action = "Action", 
        SearchCategory = "", 
        SearchCriteria = "" 
    }
);

У меня есть модель, реализующая IValidateableObject, и я проверяю, что что-то было введено, но очевидно, что привязка маршрута выполняется до того, как что-либо может быть проверено.

Есть идеи ???

Маршруты

context.MapRoute(
    "Dashboard-Search-NoCriteria",
    "HEP/Dashboard/Search/{category}",
    new { controller = "Dashboard", action = "Search", category = "Case No" }
);

context.MapRoute(
    "Dashboard-Search",
    "HEP/Dashboard/Search/{category}/{criteria}",
    new { controller = "Dashboard", action = "Search", category = "Case No", criteria = "" }
);

Действие контроллера

[HttpGet]
public ActionResult Search(string SearchCategory, string SearchCriteria)
{
    // create new instance of model and add search criteria so entered
    // data persists on post back
    DashboardModel model = new DashboardModel() {
        SearchCategory = SearchCategory,
        SearchCriteria = SearchCriteria
    };
    model.Search(SearchCategory, SearchCriteria);

    // return the HTML view of another controller that displays the same list,
    // only this time, the list is filtered according to GET data
    return View("Overview", model);
}

HTML-форма

@using (Html.BeginForm("Search", "Dashboard", FormMethod.Get)) {

    @Html.LabelFor(m => m.SearchCategory, "Category:")
    @Html.DropDownListFor(m => m.SearchCategory, new List<SelectListItem>() {
        new SelectListItem() { Selected = true, Text = "Category", Value = "Category" }
    })

    @Html.LabelFor(m => m.SearchCriteria, "Criteria:")
    @Html.TextBoxFor(m => m.SearchCriteria)

    <input type="submit" value="Search" class="button" />

}

Ответы [ 3 ]

0 голосов
/ 12 января 2012
[HttpGet]
public ActionResult Search(string SearchCategory = null, string SearchCriteria = null)

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

0 голосов
/ 13 января 2012

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

context.MapRoute(
    "Dashboard-Search",
    "HEP/Dashboard/Search/{category}/{criteria}",
    new { controller = "Dashboard", action = "Search", category = "Case No", criteria = UrlParameter.Optional });
0 голосов
/ 12 января 2012

Ваши маршруты сейчас не соответствуют вашей форме поиска.

URL, который удовлетворяет вашему Dashboard-Search маршруту, должен выглядеть следующим образом:

http://example.com/HEP/Dashboard/Search/SampleCategory/SampleCriteria

Ваша форма в свою очередь выдаст запрос GETна URL-адрес, подобный следующему:

http://example.com/HEP/Dashboard/Search/?Category=SampleCategory&Criteria=SampleCriteria

Скорее всего, ваш метод Search(string SearchCategory, string SearchCriteria) никогда не вызывается - я бы посоветовал перенаправить ваш запрос обратно на метод, который просто отображает ваше представление поиска, фактически не выполняя никаких действий.поиск.

Пожалуйста, покажите весь метод RegisterRoutes, если вам нужно больше объяснений или кода.

...