2017-09-03 81 views
0

我有一個使用VS2015創建的asp.net MVC應用程序。ActionLink助手通過參數,無參數名稱

以我剃刀視圖,我有以下:

@Html.ActionLink(linkText: "Detail", 
            actionName: "Index", 
            controllerName: "SupportNotificationDetail", 
            routeValues: new { id = item.DetailFilename }, 
            htmlAttributes: null) 

用於我的控制器方法的定義如下:

public class SupportNotificationDetailController : Controller 
    { 
     // GET: SupportNotificationDetail 
     public ActionResult Index(string id) 

我已沒有更改默認路由配置。

我的問題是,動作鏈接產生以下網址:

ESBAMPortal/SupportNotificationDetail/Index/%7B43794F0E-23AD-4A70-AF39-3364E93F5832%7D.html 

對於這一點,我得到一個404錯誤。如果我手動在瀏覽器地址欄中編輯URL,以便id參數被命名爲 - 然後正確的頁面加載:

ESBAMPortal/SupportNotificationDetail/Index?id=%7B43794F0E-23AD-4A70-AF39-3364E93F5832%7D.html 

如果我能找到一個答案,下面的任一則我將能夠今晚睡覺:

爲什麼沒有指定id參數的URL會給出404? 如何讓ActionLink助手提供所需的URL?

回答

1

當您請求url yourSiteName/SupportNotificationDetail/Index/somefile.html時,請求將由IIS處理,因爲請求url正在查找靜態內容html文件(該請求明確具有文件擴展名)。所以iis會嘗試直接提供服務,而不需要通過MVC請求管道。

但是,當您請求yourSiteName/SupportNotificationDetail/Index?id=somefile.html時,somefile.html是查詢字符串值。所以IIS不會直接提供響應。它將被髮送到MVC管道,並且由於請求與路由表中註冊的路由定義匹配,它將被轉發到帶有參數id和它的值的Index操作方法。

默認MVC路由定義的請求url模式爲{controller}/{action}/{id},其中id是操作方法的可選參數。出於這個原因,輔助方法會生成鏈接以匹配上述模式,因此您將得到沒有id參數的url。

您可以將參數名稱從Id更改爲其他內容,然後ActionLink助手方法將使用顯式querystring參數名稱生成目標url。

public class SupportNotificationDetailController : Controller 
{ 
    public ActionResult Index(string fildId) 
    { 
     return Content(fildId); 
    } 
} 

並在視圖,

@Html.ActionLink("Detail", "Index", "SupportNotificationDetail", 
             new { fildId = Model.DetailFilename }, null)