Форматирование запросов в asp.net MVC 2
Кажется, это простой вопрос, но я не могу понять это сам...
У меня есть ActionLink, как так
Html.ActionLink( "Test", "test", new { q = "search+twitter" } )
Это производит строку URL следующим образом
HTTP: // MyServer / тест д = поиск% 2Btwitter
Но я хотел бы сохранить знак плюс (который я предполагаю, что это UrlPathEncoded), чтобы я получил следующий URL
HTTP: // MyServer / тест д = поиск + твиттер
Есть ли простой способ сделать это, все еще используя Html.ActionLink?
2 ответа
После еще нескольких поисков я перефразировал вопрос в этом посте. Используя ответ на этот вопрос, я смог собрать подходящий метод расширения маршрутизации, который я включил ниже.
public static class RouteCollectionExtensions
{
public static void CustomMapRoute( this RouteCollection routes, string name, string url, object defaults )
{
routes.CustomMapRoute( name, url, defaults, null, null );
}
public static void CustomMapRoute( this RouteCollection routes, string name, string url, object defaults, string[] namespaces )
{
routes.CustomMapRoute( name, url, defaults, namespaces, null );
}
public static void CustomMapRoute( this RouteCollection routes, string name, string url, object defaults, string[] namespaces, object constraints )
{
if ( routes == null )
throw new ArgumentNullException( "routes" );
if ( url == null )
throw new ArgumentNullException( "url" );
var route = new CustomRoute( url, new MvcRouteHandler() )
{
Defaults = new RouteValueDictionary( defaults ),
Constraints = new RouteValueDictionary( constraints ),
DataTokens = new RouteValueDictionary()
};
if ( (namespaces != null) && (namespaces.Length > 0) )
{
route.DataTokens["Namespaces"] = namespaces;
}
if ( String.IsNullOrEmpty( name ) )
routes.Add( route );
else
routes.Add( name, route );
}
}
public class CustomRoute : Route
{
public CustomRoute( string url, IRouteHandler routeHandler )
: base( url, routeHandler ) { }
public CustomRoute( string url, RouteValueDictionary defaults, IRouteHandler routeHandler )
: base( url, defaults, routeHandler )
{ }
public override VirtualPathData GetVirtualPath( RequestContext requestContext, RouteValueDictionary values )
{
var path = base.GetVirtualPath( requestContext, values );
if ( path != null )
{
path.VirtualPath = path.VirtualPath.Replace( "%20", "+" );
}
return path;
}
}
Это расширение затем вызывается методом RegisterRoutes в global.asax, например так...
routes.CustomMapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new string[] { "MyControllers" }
);
Знак плюс (после кодирования) представляет пробел перед кодированием.
Так search+twitter
станет "поиском в твиттере" на посте назад, и для достижения этого эффекта вы можете просто использовать "поиск в твиттере" в первую очередь:
Html.ActionLink ("Test", "test", new {q = "search twitter"})
который будет генерировать следующий URL
HTTP: // MyServer / тест д = поиск% 20twitter
Надеюсь это поможет.