Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC路由异常或意外行为_C#_Asp.net Mvc - Fatal编程技术网

C# ASP.NET MVC路由异常或意外行为

C# ASP.NET MVC路由异常或意外行为,c#,asp.net-mvc,C#,Asp.net Mvc,我对ASP.NET MVC非常陌生,正在开发一个使用ASP.NET MVC 2的电子商务应用程序 对于所有场景,默认路由都可以正常工作。但我需要为URL定义自己的规则,如下所示: http://localhost/mvc2proj/products http://localhost/mvc2proj/products/productname 为此,我在默认路由的正上方定义了一个新路由: routes.MapRoute( "Products", "Product

我对ASP.NET MVC非常陌生,正在开发一个使用ASP.NET MVC 2的电子商务应用程序

对于所有场景,默认路由都可以正常工作。但我需要为URL定义自己的规则,如下所示:

  • http://localhost/mvc2proj/products
  • http://localhost/mvc2proj/products/productname
  • 为此,我在默认路由的正上方定义了一个新路由:

     routes.MapRoute(
            "Products", 
            "Products/{productName}",
            new { controller = "Products", action = "Index" }
     );
    
    当显示主页时,它工作正常。即当URL为http://localhost/mvc2proj时,菜单标题“Products”的锚定标记的href属性为“href=”mvc2proj/Products“Products”

    但是,当URL为http://localhost/mvc2proj/products/productname时,菜单标题“products”的锚定标记的href属性也会更改为href=“mvc2proj/products/productname”,这显然是不需要的。每当单独单击产品类别时,不应更改菜单href。它应该保持不变

    我将菜单定义为如下用户控件:

    <li><%=Html.RouteLink("Home", new { Controller = "Main", Action = "Index" })%></li>
    <li><%=Html.RouteLink("Products", new{ Controller = "Products" } ) %></li>
    
    <%foreach(var product in Model.Products) {%>
        <li><%=Html.RouteLink(Html.Encode(product.ProductName), new { controller = "Products", productName = product.ProductName })%></li>
    <%} %>
    
  • 产品的子类别定义如下:

    <li><%=Html.RouteLink("Home", new { Controller = "Main", Action = "Index" })%></li>
    <li><%=Html.RouteLink("Products", new{ Controller = "Products" } ) %></li>
    
    <%foreach(var product in Model.Products) {%>
        <li><%=Html.RouteLink(Html.Encode(product.ProductName), new { controller = "Products", productName = product.ProductName })%></li>
    <%} %>
    
    
    
  • 子类别的HTML为:

    <li><a href="/mvc2proj/Products/Product1">Product1</a></li>
    <li><a href="/mvc2proj/Products/product2">Product2</a></li>
    
  • 。。。。。。。等等单击这些链接将更改菜单URL


    请帮助我。

    这可能不是最好的解决方案,但我通过为索引页定义不同于单个产品页的路径来解决类似问题,例如:

    routes.MapRoute(
    "ProductIndex", 
    "Products",
    new { controller = "Products", action = "Index" }
    );
    
    这将是对现有路线的补充。我想我实际上对每种方法都使用了不同的操作方法,但是如果您为参数提供了默认值,就没有必要这样做


    我相信有更好的方法,这个解决方案来自于对真正发生的事情缺乏了解,但它可能会帮助你解决眼前的问题

    Thanx是我的朋友。我已经实施了类似于您提出的解决方案。但现在URL看起来像http://localhost/mvc2proj/products?productName=prod_name,而不是http://localhost/mvc2proj/products/prod_name。有什么解决办法吗?最好的问候,Vikas Anand这是因为它在带有{productName}的路由之前找到了“ProductsIndex”路由-尝试将{productName}路由放在第一位,并且在转到索引路由时不传递产品名称。确保您的Html.routeLink也引用了正确的路由。很高兴它有一点帮助,如果它解决了问题,别忘了接受答案;)(无耻的钓鱼!)你能举个例子解释一下吗?我对ASP.NET MVC非常陌生:(将我提供给您的路由放在RegisterRoutes方法中的路由之后。然后使用Html.RouteLink(“ProductIndex”)作为索引页的链接[在那里您可能需要任何其他选项,但请注意,您不需要指定控制器,因为它已经在路由中,因为您的问题已经在控制器中了],并使用Html.RouteLink(“Products”,new{productName=“whatever”})作为特定产品页面的链接;。对于特定的产品链接,您可能需要指定几个其他参数,我忘记了您想要的确切重载。希望这将为您指明正确的方向!非常感谢!!!!!它成功了。但是我可以知道当我单击产品列表时导航被更改的原因吗?原因将非常感谢。再次感谢.