Как заменить «-» на «_» в URL перед отображением контроллера и действия в приложении .net mvc3 - PullRequest
2 голосов
/ 10 октября 2011

Привет всем: я работаю над приложением .net mvc3.Вот мой контроллер и действие:

public class Foo_Bar : Controller
{
     public ViewResult Foo_Bar()        
    {

        return View();
    }
}

И мой файл представления corespondent: Foo_Bar.cshtml

, теперь мой вопрос: у меня есть URL как: www.mystite.com/foo-bar / foo-bar, но этот URL не может вызывать контроллер и действие Foo_Bar / Foo_Bar, за исключением того, что я пишу его как thes: www.mystite.com/foo_bar/foo_bar.

Теперь мне нужно заменить "- "с" _ "перед тем, как система маршрутизации отобразит мой контроллер и действие.Могу ли я сделать это в маршрутах. MapRoute ()?Кто-нибудь, пожалуйста, помогите мне. Спасибо заранее! Ps: я впервые задаю вопрос в переполнении стека:)

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Вы можете создать пользовательский RouteHandler, чтобы изменить значения для {action} и {controller}. Сначала создайте свой RouteHandler следующим образом:

using System.Web.Mvc;  
using System.Web.Routing;  

public class MyRouteHandler : IRouteHandler  
{  
    public IHttpHandler GetHttpHandler(RequestContext requestContext)  
    {  
        var routeData = requestContext.RouteData;  
        var controller = routeData.Values["controller"].ToString(); 
        routeData.Values["controller"] = controller.Replace("-", "_");  
        var action = routeData.Values["action"].ToString();  
        routeData.Values["action"] = action.Replace("-", "_");  
        var handler = new MvcHandler(requestContext);  
        return handler;  
    }  
}  

Затем измените маршрут по умолчанию следующим образом:

routes.Add("Default",  
    new Route("{controller}/{action}/{id}",  
        new RouteValueDictionary(  
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }),  
            new MyRouteHandler() 
        ) 
    );  
); 

Когда запрос удовлетворен этим маршрутом, RouteHandler изменит черточки на подчеркивания.

1 голос
/ 10 октября 2011

Используйте атрибут [ActionName]

public class Foo_Bar : Controller
{
     [ActionName("foo-bar")]
     public ViewResult Foo_Bar()        
    {

        return View();
    }
}

Не существует эквивалента для контроллеров, поэтому вы не можете использовать его в своем маршруте с {controller}.Но вы можете определить это явно, по крайней мере.

...