C#Asp.Net MVC - 仅参数操作请求

时间:2018-06-13 21:29:12

标签: c# .net asp.net-mvc url-routing asp.net-mvc-routing

我有一个Asp.Net MVC项目,我们允许用户拥有公开的个人资料。

我想改进网址,以便它更友好,更短。

现有代码如下 -

public class ProfileController : Controller
    {
        private readonly IUserProfileService _userProfileService;

        public ProfileController(IUserProfileService userProfileService)
        {
            this._userProfileService = userProfileService;
        }

        public ActionResult Index(string id)
        {
            //Get users profile from the database using the id
            var viewModel = _userProfileService.Get(id);

            return View(viewModel);
        }
    }


public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //Required for the route prefix attributes to work!
        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            "ProfileUrlIndexActionRemoval",
            "Profile/{id}",
            new { controller = "Profile", action = "Index" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

上述代码允许以下网址工作(基于默认的MVC路由) - www.mydomain.com/profile/john-doe

我需要实施哪种路由,以便让以下网址正常工作 - www.mydomain.com/john-doe

感谢。

2 个答案:

答案 0 :(得分:1)

这有点棘手,因为您希望站点根目录中的友好URL,而不与任何其他路由冲突。

这意味着如果您有任何其他路线,例如关于或联系,您需要确保在友好路线之前的路线表中以避免路线冲突。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //Required for the route prefix attributes to work!
        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            "ProfileUrlIndexActionRemoval",
            "Profile/{id}",
            new { controller = "Profile", action = "Index" }
        );

        routes.MapRoute(
            name: "Home",
            url: "Home/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "About",
            url: "About/{action}/{id}",
            defaults: new { controller = "About", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Contact",
            url: "Contact/{action}/{id}",
            defaults: new { controller = "Contact", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            "Default_Frieldly",
            "{*id}",
            new { controller = "Profile", action = "Index" }
        );
    }
}

最后因为默认路由会捕获所有不匹配的路由,所以您需要考虑未找到的配置文件。

public class ProfileController : Controller {

    //...code removed for brevity

    public ActionResult Index(string id) {
        //Get users profile from the database using the id
        var viewModel = _userProfileService.Get(id);

        if(viewModel == null) {
            return NotFound();
        }

        return View(viewModel);
    }
}

通过在原始URL中使用配置文件控制器前缀,它使其唯一,以避免路由冲突,但是想要根友好的URL,虽然不是不可能,但是你看到需要跳过的箍以获得所需的行为。

答案 1 :(得分:0)

我就是这样做的。在根斜杠后注册与任何字符串匹配的路由。

请注意,这严重限制了您可以用于应用程序的路由,因为并非匹配/{id}的所有内容实际上可能都是用户ID,这就是为什么应用程序通常会在路由前加/profile或{{ 1}}。

/p