[英]Route Url in ASP MVC with changing parameters name
我正在使用Asp.NET MVC 5
我有以下控制器
public class AController : Controller {
public ActionResult ActionA(int param1, int param2) {
return Content("Whatever") ;
}
}
將url /B/ActionB?p1=5&p2=9
重定向到/A/ActionA?param1=p1¶m2=p2
的正確方法是什么/A/ActionA?param1=p1¶m2=p2
?
編輯:我嘗試了以下方法,但是我在轉換參數方面遇到了困難
public class AController : Controller {
[Route("/B/ActionB")]
public ActionResult ActionA(int param1, int param2) {
return Content("Whatever") ;
}
}
重定向的正確方法是使用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狀態代碼響應,告訴瀏覽器獲取URL /A/ActionA?param1=5¶m2=9
。 因此,它將服務器的往返行程變為2。
從應用程序設計的角度來看,直接進入/A/ActionA?param1=5¶m2=9
更有意義,除非您/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重定向。 有一個例子在這里 ,盡管這需要進行修改,以從請求中提取的查詢字符串參數,並使用不同的名稱將它們傳遞到接收端。
據我了解,查詢字符串可以使用路由約束在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");
}
}
注意, 肯Egozi說屬性與查詢字符串參數(使用路由?
& &
)只支持的Web API控制器 ,如MVC控制器可以綁定查詢字符串通過定制模型綁定的解決方法操作參數(S)。
類似問題:
有關:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.