簡體   English   中英

使用更改的參數名稱在ASP MVC中路由URL

[英]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&param2=p2的正確方法是什么/A/ActionA?param1=p1&param2=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&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狀態代碼響應,告訴瀏覽器獲取URL /A/ActionA?param1=5&param2=9 因此,它將服務器的往返行程變為2。

從應用程序設計的角度來看,直接進入/A/ActionA?param1=5&param2=9更有意義,除非您/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重定向。 有一個例子在這里 ,盡管這需要進行修改,以從請求中提取的查詢字符串參數,並使用不同的名稱將它們傳遞到接收端。

據我了解,查詢字符串可以使用路由約束在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)。

類似問題:

使用屬性路由時查詢字符串不起作用

有關:

如何在ASP.NET MVC中路由帶有查詢字符串的URL?

如何在Asp.Net MVC中使用Querystring參數檢索或發送數據?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM