如何通过Routeconfig显示自定义URL

时间:2017-05-23 06:01:07

标签: c# asp.net-mvc-5

我在HTML中有一个操作链接。

<a href="@Url.Action("UserWisedPost", "Blog", new { userName = item.UserName,userId=item.UserId })">@item.UserName</a>

在控制器中,

public ActionResult UserWisedPost(string userId,string userName, int? page, int pageSize = 10)
{
     page = page == null || page == 0 ? 1 : page;
     var model = _post.GetByUserId(userId).ToPagedList((int)page, pageSize); 
     return View(model);
}

在RouteConfig中

routes.MapRoute(
                name: "userwisedPost",
                url: "{controller}/{action}/{userName}",
                defaults: new { controller = "Blog", action = "UserWisedPost", userName=UrlParameter.Optional}
            );

你可能已经理解了我的意思。我想显示../UserWisedPost/userName之类的网址,但希望在控制器中按userId访问数据。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我认为这里的问题是默认路由优先。

我猜你在自定义路线之前有这个:

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

在此之前您需要自定义路由,否则这将是处理BlogController请求的路由。

解决这个问题的简单方法是这样的:

routes.MapRoute(
            name: "userwisedPost",
            url: "Blog/{action}/{userName}",
            defaults: new { controller = "Blog", action = "UserWisedPost", userName = UrlParameter.Optional }
        );

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

这会产生这样的网址:Blog/UserWisedPost/SomeUserName?userId=someUserId

答案 1 :(得分:1)

如果您想要查询字符串以外的userId,则应添加表单并将其作为隐藏字段。

或者,您可以使用AJAX发布数据:

<a href="postUserWised(@Url.Action("UserWisedPost", "Blog"), @item.UserName,@item.UserId)">@item.UserName</a>

然后在该视图的脚本部分中:

@section scripts {
<script type="text/javascript">
   function postUserWised( url, userName, userId) {
      $.ajax({
        url: url,
        type: POST,
        data: { userName: userName, userId: userId },
        success: function(data) { },
        error: function(...) { } 
      });
   }
</script>
}

我没有对此进行测试,但它应该指向正确的方向。