0

我遇到以下問題。我設置MVC SiteMap,但有一個節點,我需要保存(保存)參數。技術上的問題解釋說:MVC SiteMap父級參數未保存

我有途徑:代理/清單/模板,從那裏我打開特定的模板, 代理/清單/ EditTemplate/1(其中1是id) 然後從那裏我打開新頁面是代理/流程/添加

在最後一頁我有面包屑: 模板>編輯模板>添加過程

,現在我想,當我點擊編輯模板,方便我重定向到代理/清單/ EditTemplate/1

我試着在Action上放置SiteMapPreserveRouteData裝飾器,但它說它已經過時。

這裏是我的Mvc.sitemap

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area ="Agent"> 
     <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="id"> 
      <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="id, id" /> 
      <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token" /> 
     </mvcSiteMapNode> 
     </mvcSiteMapNode> 

感謝

回答

0

醃製路線參數從當前請求保存。因此,每個路由密鑰在同一個節點祖先內必須是唯一的。換句話說,當使用preservedRouteParameters時,不能再次使用id來達到不同的目的(不同的實體)。

使用preservedRouteParameters,id路由值只能用於一個級別。如果您的級別比這更深,則需要爲每個級別創建一個唯一的路由密鑰。

而且您確實需要確保爲每個祖先保留父節點的參數,否則URL將無法正確構建。

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area="Agent"> 
    <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="checklistId"> 
     <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="processId,checklistId" /> 
     <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token,processId,checklistId" /> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

一個簡單的方法來管理這是爲每個控制器添加一個路由。

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Checklists", 
      "Checklists/{action}/{checklistId}", 
      new { controller = "Checklists", action = "Index", checklistId = UrlParameter.Optional }); 

     routes.MapRoute(
      "Processes", 
      "Processes/{action}/{processId}", 
      new { controller = "Processes", action = "Index", processId = UrlParameter.Optional }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

然後,您需要將血統數據添加到每個網址。

@Html.ActionLink("Edit Process", "Edit", "Process", new { token = "1234", processId = "5678", checklistId = "23" } , null) 

同時使用preservedRouteParameters和動態節點提供商的樣品見these demos

+0

閱讀了一些文檔後,我明白了RouteParameters的工作原理。但是我們有這樣一種系統,父母有一個id,子節點有另一個id。然後我想到保存自定義屬性並重寫SiteMapNodeModel.cshtml來正確構建url,但沒有運氣,它會記住當前請求的屬性,但是當我在孩子中關閉時,父項的屬性會丟失。我必須承認,我對這個功能提供的功能並不滿意,因爲我需要的只是一個堆棧,而且這些路由的調用方式完全相同。 –

+0

沒有什麼能夠阻止您對rollersRouteParameters進行開溝操作,併爲每個值添加一個節點(默認行爲),這就是我提到動態節點提供者的原因。 preservedRouteParamters只在特定條件下工作 - 其中之一是整個血統不得複製相同的路由密鑰。如果您正在執行CRUD操作,它會更好地擴展,但靈活性較差。 – NightOwl888

+0

嗯,業務情況如下: 我打開一些模板與一些ID,然後從那裏我打開一個令牌(不同於模板令牌)的過程。 此外我有以下情況: 人檔案>就業>工作>終止工作,他們都有不同的ID參數,我沒有看到任何可能的選項來解決這個問題。 所以我正在看你的動態例子,但這隻能解決我的一個級別。而且我在系統中有很多地方需要實現這個功能,所以它有種靜態寫入的能力。 –