2009-03-11 4 views
0

В моем asp.net-mvc ontroller я принимаю кучу значений поля формы, и из них создаются строки, которые понимает библиотека Lucene. Затем я хочу перенаправить метод get, который будет показывать результаты в зависимости от этой строки lucene.Где я должен добавить строку запроса (url-encoded) в моем названном маршруте?

Строка Lucene в шаблоне {FIELDNAME1: value1 FIELDNAME2: value2 ...}

мой Global.asax имеет следующую запись для целевого перенаправления:

routes.MapRoute(
    "AdvancedSearch", 
    "AdvancedSearch.mvc/{displayType}/luceneString", 
    new { controller = "Search", action = "AdvancedSearch", 
      displayType = "chip", luceneString = "" } 
); 

Так что мой контроллер уловов пост, создает luceneString и выполняет следующие функции:

return RedirectToRoute("AdvancedSearch", new 
    { 
     Controller = "Search", 
     action = "AdvancedSearch",    
     displayType = "chip", 
     queryString = Url.Encode("company:test name:testname") 
    }); 

Это дает мне 500: плохой запрос. Даже с одним параметром он не работает. Даже с «:» это не работает.
Я пробовал:

  • AdvancedSearch.mvc/чип/Компания% 3Atest + имя% 3AtestName
  • AdvancedSearch.mvc/чип/компания: тест + название: АСМАП
  • AdvancedSearch.mvc/чип/компании : тест
  • AdvancedSearch.mvc/чип/компания% 3Atest

Это работает только если я изменить этот адрес, чтобы взять QueryString в формате

AdvancedSearch.mvc/chip?q=company%3Atest+name%3AtestName 

Что я должен сделать, чтобы получить право кодирования, не прибегая к «? Д =»
Если я должен использовать строку запроса, как я могу определить такую ​​вещь в таблице маршрутов? Как мне перейти на перенаправление?

+0

У меня нет ответа, но это звучит, как вы пытаетесь получить АСП-MVC, чтобы сделать что-то, что не должны. Маршруты должны быть RESTful способом замены строк запроса. Я понимаю, что Луцен может потребовать этого, но любое решение, которое вы придумали, скорее всего, будет перемахом. –

+0

Как так? Если я правильно понял, мой URL будет RESTfull. Запрос на получение URL-адреса всегда будет возвращать одну и ту же страницу. Никакой сессии или вообще не требуется. Просто последняя часть моего URL-адреса содержит строку запроса. –

+0

Мои запросы на отправку будут перенаправлены на запрос GET. Они все равно будут без гражданства. Является ли тот факт, что последняя часть моего URL-адреса является lucene-строкой, делает RESTless? –

ответ

3

Во-первых, ваш MapRoute не должен содержать ничего относительно строки запроса. Маршруты содержат только ресурсную часть URI; они не включают запрос.

Во-вторых, вам не нужно кодировать строку запроса; ActionLink/RouteLink/и т.д.. сделают это для вас. Когда вы создаете HREF, любые маркеры, не содержащиеся в маршруте, автоматически станут закодированными параметрами строки запроса.

Снимите:

/luceneString 

... от маршрута.

Изменить код:

return RedirectToRoute("AdvancedSearch", new 
{ 
    Controller = "Search", 
    action = "AdvancedSearch",    
    displayType = "chip", 
    q = "company:test name:testname" 
}); 
+0

Спасибо, что работает. Но почему мой luceneString не может быть частью URL-адреса? Как это повлияет на кеширование? Кэширование зависит от запроса? –

+0

Если вы хотите это в ресурсной части URI, это часть маршрута. Если вы хотите его в части строки запроса в URI, это не является частью маршрута. Как правило, кэширование зависит от всего URI, включая строку запроса, но зависит от того, какое кэширование вы спрашиваете. –

+0

Кассирование IIS по умолчанию. –