C# 操作生成错误的Url

C# 操作生成错误的Url,c#,asp.net-mvc,C#,Asp.net Mvc,我使用Url.Action方法生成Url字符串 结果是: "/Home/GetRejectTest/0?IsSelected=False" 控制器和操作名称正确,但查询参数错误。这是因为操作没有RouteAttribute,因此生成了查询参数吗 我的行动: public ActionResult GetRejectTest(Test test) { return new EmptyResult(); } 测试类具有这3个属性I

我使用Url.Action方法生成Url字符串

结果是:

"/Home/GetRejectTest/0?IsSelected=False"
控制器和操作名称正确,但查询参数错误。这是因为操作没有RouteAttribute,因此生成了查询参数吗

我的行动:

   public ActionResult GetRejectTest(Test test)
        {
            return new EmptyResult();

        }
测试类具有这3个属性Id、名称和IsSelected

我的路线定义:

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
生成的url(
/Home/GetRejectTest/0?IsSelected=False
)对于路由定义是正确的。将
Test
的新实例传递给
Url.Action()
方法,该方法

  • 根据名称和值在内部构建字典 (使用模型中每个属性的
    .ToString()。
    
    controller=Home,action=GetRejectTest,id=0,Name=null,IsSelected=False
  • 然后搜索路线定义以查找匹配项 (
    url:{controller}/{action}/{id}”
    )并更新占位符 (此时会生成
    /Home/GetRejectTest/0
    )但是 路由定义没有
    Name
    和的url参数
    IsSelected
    ,因此这些被添加为查询字符串参数(因为
    Name
    null
    ,不生成该属性的查询字符串) 因此,结果现在是
    /Home/GetRejectTest/0?IsSelected=False
  • 您尚未指出实际期望的结果,但创建特定的管线定义可以解决大多数情况。例如,如果你想

    /Home/GetRejectTest/0/false
    
    或者
    /Home/GetRejectTest/0/false/someName
    如果
    Name
    的值不是
    null
    ,则可以创建其他路由(必须在默认路由之前)

    请注意,由于
    Name
    string
    的类型,因此可以是
    null
    ,因此
    {Name}
    占位符需要是最后一个占位符,并标记为
    urlparmeter。可选的
    (否则将恢复为使用查询字符串参数)

    生成的url(
    /Home/GetRejectTest/0?IsSelected=False
    )对于路由定义是正确的。您将
    Test
    的新实例传递给
    Url.Action()
    方法,该方法

  • 根据名称和值在内部构建字典 (使用模型中每个属性的
    .ToString()。
    
    controller=Home,action=GetRejectTest,id=0,Name=null,IsSelected=False
  • 然后搜索路线定义以查找匹配项 (
    url:{controller}/{action}/{id}”
    )并更新占位符 (此时会生成
    /Home/GetRejectTest/0
    )但是 路由定义没有
    Name
    和的url参数
    IsSelected
    ,因此这些被添加为查询字符串参数(因为
    Name
    null
    ,不生成该属性的查询字符串) 因此,结果现在是
    /Home/GetRejectTest/0?IsSelected=False
  • 您尚未指出实际期望的结果,但创建特定的管线定义可以解决大多数情况。例如,如果您希望

    /Home/GetRejectTest/0/false
    
    或者
    /Home/GetRejectTest/0/false/someName
    如果
    Name
    的值不是
    null
    ,则可以创建其他路由(必须在默认路由之前)


    请注意,由于
    Name
    string
    的类型,因此可以是
    null
    ,因此
    {Name}
    占位符需要是最后一个占位符,并标记为
    UrlParameter。可选的
    (否则将恢复使用查询字符串参数)

    什么是
    urlHelper
    ?显示操作方法签名和相关的注册路由ITS System.Web.Mvc.urlHelper什么是值?从屏幕截图上看,字典的名称和Id都有0和null值。因此,无论您得到什么,都是预期结果。不是吗?假设
    是新的默认值
    Test
    ,(以及您使用默认路由
    {controller}/{action}/{id}
    ),那么url就正确了什么是
    urlHelper
    ?显示操作方法签名和相关的注册路由its System.Web.Mvc.urlHelper什么是值?。从屏幕截图上看,字典的名称和Id都有0和null值。因此无论您得到什么都是预期的结果。不是吗?假设
    值>是
    Test
    的一个新的默认实例(并且您使用默认路由
    {controller}/{action}/{id}
    ),那么url是正确的。现在我明白了。我在自己身上使用id作为查询参数是愚蠢的;-)谢谢您的合理解释。现在我明白了。我在自己身上使用id作为查询参数是愚蠢的;-)谢谢你的合理解释。