使用更改参数名称在ASP MVC中路由URL

时间:2017-10-12 08:11:39

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

我正在使用Asp.NET mvc 5

我有以下控制器

public class AController : Controller {
   public ActionResult ActionA(int param1, int param2) { 
         return Content("Whatever") ; 
   } 
}

重定向网址的正确方法是什么 /B/ActionB?p1=5&p2=9/A/ActionA?param1=p1&param2=p2

编辑: 我试过以下但是我很难转换参数

public class AController : Controller {
   [Route("/B/ActionB")]
   public ActionResult ActionA(int param1, int param2) { 
         return Content("Whatever") ; 
   } 
}

2 个答案:

答案 0 :(得分:0)

重定向的正确方法是使用RedirectToAction

// URL /B/ActionB?p1=5&p2=9
public class BController : Controller {
    public ActionResult ActionB(int p1, int p2) { 
        return RedirectToAction("ActionA", "A", new { param1 = p1, param2 = p2 });
   } 
}

// URL /A/ActionA?param1=5&param2=9
public class AController : Controller {
    public ActionResult ActionA(int param1, int param2) { 
        return Content("Whatever") ; 
   } 
}

但请注意,调用/B/ActionB?p1=5&p2=9将达到ActionB,然后MVC将回复302状态代码,告知浏览器获取网址/A/ActionA?param1=5&param2=9。因此,它将服务器的1次往返转为2。

从应用程序设计的角度来看,直接转到/A/ActionA?param1=5&param2=9更有意义,除非您有一些特定原因需要在用户的浏览器中更改URL。

如果您的目标是将所有流量从BController.ActionB转移到AController.ActionA,因为您要在应用中替换它,则应该进行301重定向。最好由IIS URL重写模块处理。

<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect /B/ActionB?p1=5&p2=9 to /A/ActionA?param1=p1&param2=p2" stopProcessing="true">
                    <match url="^B/ActionB?p1=(\d+)&p2=(\d+)" />
                    <action type="Redirect" url="A/ActionA?param1={R:1}&param2={R:2}" redirectType="Permanent" />
                </rule>         
            </rules>
        </rewrite>
        <httpProtocol>
            <redirectHeaders>
                <!-- This is to ensure that clients don't cache the 301 itself - this is dangerous because the 301 can't change when put in place once it is cached -->
                <add name="Cache-Control" value="no-cache"/>
            </redirectHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

请注意,如果查询字符串参数是可选的或者可能以相反的顺序显示,则需要添加其他规则来涵盖这些情况。

或者,您可以在MVC中使用路由进行301重定向。有一个示例here,虽然需要修改它以从请求中提取查询字符串参数,并使用不同的名称将它们传递给接收端。

答案 1 :(得分:0)

根据我的想法,查询字符串可以使用路由约束在RouteAttribute上表示,因此查询字符串:

/B/ActionB?p1=5&p2=9

RouteAttribute参数中表示如下:

/B/ActionB/{param1:int}/{param2:int}

或包含参数(不完全确定这项工作,因此我更喜欢前者):

/B/ActionB/{p1=param1:int}/{p2=param2:int}

由于您正在使用MVC 5,因此参数应放在RouteAttribute内,如下例所示:

public class AController : Controller {

   [Route("/B/ActionB/{param1:int}/{param2:int}")]
   public ActionResult ActionA(int param1, int param2) { 
         return Content("Whatever"); 
   } 
}

请注意,Ken Egozi said属性路由与查询字符串参数(使用?&amp; &)仅由Web API controller支持,如在MVC控制器中,您可以绑定查询string作为动作参数,通过自定义模型绑定器作为变通方法。

类似问题:

Query string not working while using attribute routing

相关:

How do I route a URL with a querystring in ASP.NET MVC?

How to use Querystring Parameters in Asp.Net MVC to Retrieve or Send Data?