我正在使用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¶m2=p2
?
编辑: 我试过以下但是我很难转换参数
public class AController : Controller {
[Route("/B/ActionB")]
public ActionResult ActionA(int param1, int param2) {
return Content("Whatever") ;
}
}
答案 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¶m2=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¶m2=9
。因此,它将服务器的1次往返转为2。
从应用程序设计的角度来看,直接转到/A/ActionA?param1=5¶m2=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¶m2=p2" stopProcessing="true">
<match url="^B/ActionB?p1=(\d+)&p2=(\d+)" />
<action type="Redirect" url="A/ActionA?param1={R:1}¶m2={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?