如何在Asp.net MVC路由多个参数中移除问号

本文关键字:参数 Asp net 路由 MVC | 更新日期: 2023-09-27 17:49:25

当我将多个参数传递给控制器动作时,我在参数中得到问号,如下所示:

http://localhost: 57728/Home/AddAndManageProperties ? BaseCategoryId = 11, SubCategoryId = 14

我想把问号去掉,像这样:

http://localhost: 57728/Home/AddAndManageProperties BaseCategoryId = 11/SubCategoryId = 14

下面是我的代码:
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
          name: "MyRout",
          url: "{controller}/{action}/{BaseCategoryId}/{SubCategoryId}",
          defaults: new { controller = "Home", action = "AddAndManageProperties", BaseCategoryId = UrlParameter.Optional, SubCategoryId = UrlParameter.Optional }
         );

    }
}

这里是Action Method:

 public ActionResult AddAndManageProperties(int? BaseCategoryId, int? SubCategoryId)
        {
        }

我通过这个方法调用AddAndManageProperties方法

 [HttpPost]
    public ActionResult AddSubCategory(SubCategory subCategory)
    {
        return RedirectToAction("AddAndManageProperties", new { BaseCategoryId = subCategory.BaseCategoryId, SubCategoryId = subCategory.SubCategoryId });
}

我是ASP新手。NET MVC所以请帮助我!

如何在Asp.net MVC路由多个参数中移除问号

MyRout移动到Default路由之前,并将其更改为

routes.MapRoute(
    name: "MyRout",
    url: "Home/AddAndManageProperties/{BaseCategoryId}/{SubCategoryId}",
    defaults: new { controller = "Home", action = "AddAndManageProperties" }
 );

注意,只有最后一个参数可以标记为UrlParameter.Optional,所以方法需要为

public ActionResult AddAndManageProperties(int BaseCategoryId, int SubCategoryId)

为上述路由,或

public ActionResult AddAndManageProperties(int BaseCategoryId, int? SubCategoryId)

如果你把上面的路由定义修改为

defaults: new { controller = "Home", action = "AddAndManageProperties", SubCategoryId = UrlParameter.Optional }

注意,如果你还想在路由中包含文本"BaseCategoryId"answers"SubCategoryId",请使用

url: "Home/AddAndManageProperties/BaseCategoryId/{BaseCategoryId}/SubCategoryId/{SubCategoryId}",

问号用于查询字符串,它们是必需的,因为这是将数据分配给操作期望的参数的方式。您不应该尝试删除它们,但您可以使用[FromBody]属性,而不是在查询字符串中发送参数。

首先,也是最重要的,你的路由顺序不对,你有多个可能导致调用错误路由的url。参见为什么在asp.net mvc中先映射特殊路由,然后再映射普通路由以获得解释。

其次,路由不能包含一个以上的UrlParamter.Optional

第三,=符号只在查询字符串中有效,除非它被编码。但在我看来,你不应该在URL中使用不安全字符,以避免随之而来的所有麻烦。在这种情况下,更好的替代方案是将=替换为-

最后,如果你真的想让参数成为可选的,一种方法是提供多个路由,这些路由只允许某些路由中的参数,而不允许其他路由中的参数。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
              name: "BaseCategoryAndSubCategoryId",
              url: "{controller}/{action}/BaseCategoryId-{BaseCategoryId}/SubCategoryId-{SubCategoryId}",
              defaults: new { controller = "Home", action = "AddAndManageProperties" }
        );
        routes.MapRoute(
            name: "BaseCategoryIdOnly",
            url: "{controller}/{action}/BaseCategoryId-{BaseCategoryId}",
            defaults: new { controller = "Home", action = "AddAndManageProperties" }
        );
        routes.MapRoute(
            name: "SubCategoryIdOnly",
            url: "{controller}/{action}/SubCategoryId-{SubCategoryId}",
            defaults: new { controller = "Home", action = "AddAndManageProperties" }
        );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

注意: Stephen的回答也是一个很好的替代方法,如果你的参数是需要在URL中传递。在我看来,如果你的action方法需要这两个参数才能运行,那么使用必需参数就更有意义了。

但是到目前为止最简单的选择是直接使用查询字符串。如果这样做,参数自然可以是可选的,并以任何顺序添加,并且您不需要任何比Default路由更多的东西。