在asp.net mvc中的url路由建议

时间:2010-05-06 04:09:28

标签: asp.net-mvc url-routing detailsview

我在其中一个视图页面中有一个操作链接

<%=Html.ActionLink("Details", "Details", new { id = Model.Id })%>并将我重定向到包含此http://localhost:1985/Materials/Details/2的网址的网页,而不是我希望将我的网址设为http://localhost:1985/Materials/Details/steel材料名称而不是ID ...这是可能......这是我的控制器动作方法,

    public ActionResult Details(int id)
    {
        var material = consRepository.GetMaterial(id);
        return View("Details", material);
    }

修改 我正在迭代从jsonresult控制器返回的json对象....

$.each(data.Results, function() {
            divs += '<a href="/Materials/Details/' + this.Id + '">Details</a>
            &nbsp;<a href="/Materials/Edit/' + this.Id + '">Edit</a></div>';
            });

我的路线看起来像这样,

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

1 个答案:

答案 0 :(得分:2)

我建议你的网址是

http://localhost:1985/Materials/Details/2/Steel

这似乎也是SO显示其网址的方式。

您的路线将被定义为

routes.MapRoute(
  "action with slug", 
  "{controller}/{action}/{id}/{slug}",
  new {controller = "Error", action = "NotFound", id = "", slug = ""}
);

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

在回答评论中的第二个问题时,“如何从链接中删除详细信息?” 如果要删除ACTION名称,因此URL只是http://site/controler/id/slug,请在具有子句路径的操作之前添加以下路由。

routes.MapRoute(
  "controller with slug", 
  "Materials/{id}/{slug}",
  new {controller = "Materials", action = "Details", id = "", slug = ""}
);

将捕获单词钢的'slug'将被动作忽略,因为您只想让Id检索材料。

创建路线链接而不是动作链接,例如

<%= Html.RouteLink(material.Name,
      "show with slug", 
      new { controller = "Materials", 
            action = "Details", 
            id = material.Id, 
            slug = Server.HtmlDecode(material.Name).Replace(" ","-")
      }) 
%>

我用连字符替换我的'slug中的空格,以便浏览器不会将它们替换为%20。

您的详细信息ActionResult将保持不变。