Ich habe eine allgemeine Notwendigkeit, einen Verweis auf meine Vorfahren beizubehalten, während ich die Sitemap durchlaufe.Erinnern an Vorfahren in MvcSiteMapProvider
Mvc.sitemap
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">
<mvcSiteMapNode title="Home" controller="Home" action="Index" >
<mvcSiteMapNode title="Products" url="~/Home/Products" roles="*">
<mvcSiteMapNode title="Harvest MAX" url="~/Home/Products/HarvestMAX" >
<mvcSiteMapNode title="Policies" url="~/Home/Products/HarvestMAX/Policy/List" productType="HarvestMax" type="P" typeFullName="AACOBusinessModel.AACO.HarvestMax.Policy" roles="*">
<mvcSiteMapNode title="Policy" controller="Object" action="Details" typeName="Policy" typeFullName="AACOBusinessModel.AACO.HarvestMax.Policy" preservedRouteParameters="id" roles="*">
<mvcSiteMapNode title="Counties" controller="Object" action="List" collection="Counties" roles="*">
<mvcSiteMapNode title="County" controller="Object" action="Details" typeName="County" typeFullName="*" preservedRouteParameters="id" roles="*">
<mvcSiteMapNode title="Land Units" controller="Object" action="List" collection="LandUnits" roles="*">
<mvcSiteMapNode title="Land Unit" controller="Object" action="Details" typeName="LandUnit" typeFullName="AACOBusinessModel.AACO.LandUnit" preservedRouteParameters="id" roles="*">
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMap>
-Controller
[SiteMapTitle("Label")]
public ActionResult Details(string typeFullName, decimal id)
{
return View(AACOBusinessModel.AACO.VersionedObject.GetObject(typeFullName?.ToType() ?? Startup.CurrentType,
ApplicationSignInManager.UserCredentials.SessionId,
id));
}
Es gibt viele Gründe, warum ich dies wollen, aber hier sind einige konkrete Beispiele.
Beispiel 1: Flucht IDs
Lassen Sie uns die URL sagen, die mir kam zu dem Policy
Knoten http://localhost:36695/AACOAgentPortal/details/Policy/814861364767412
ist.
Sobald ich an, dass navigieren hinunter zum County
Knoten, sieht meine Brotkrumen wie folgt aus:
Allerdings, wenn ich über die Policy
Brotkrümel schweben, da die URL http://localhost:36695/AACOAgentPortal/Object/Details?typeName=Policy&typeFullName=AACOBusinessModel.AACO.HarvestMax.Policy
ist. Wie Sie sehen können, ist die id
weg.
Beispiel 2: Flucht Titel
Wie Sie in meinem Controller sehen kann, ich sage mvc Sitemap, die ich die Label-Eigenschaft verwenden, um die Knotentitel angezeigt werden soll. Es tut das, wenn es der Blattknoten ist:
Aber sobald ich an, dass gehen, es verschwindet:
Beide Probleme eine gemeinsame Ursache haben kann. Es gibt andere Gründe, warum ich einen Bezug zu einem Vorfahren entlang des Brotkrumenweges haben möchte, aber dies sind zwei konkrete, um das Problem zu veranschaulichen.
Dank. Zu jedem Knoten gehört nur eine ID (und ein Objekt). Letztendlich habe ich das gelöst, indem ich eine Sammlung von 'MyNamespace.MenuItem'-Modellobjekten erstellt habe, die ich bei der Navigation aktualisiere, die ich in der Benutzersitzung ablege, und ich konsultiere nur diese Sammlung, wenn ich das diesem Knoten zugeordnete .net-Objekt erhalten möchte . Dies ist analog zur 'object Tag'-Eigenschaft auf dem alten winforms 'TreeView'-Steuerelement' TreeNode'. Ist mein Ansatz übertrieben? Macht der 'MvcSiteMapProvider' das schon? – toddmo
Ja, das Standardverhalten (ohne Verwendung von preservedRouteParameters) erwartet, dass Sie 1 Knoten pro Entity erstellen, der dann beim Start zwischengespeichert und zwischen Benutzern geteilt wird. Der Sitzungsstatus wird wahrscheinlich weniger effizient sein. Sie können einen [Dynamic Node Provider] (https://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider) verwenden, um alle Ihre Entitäten zu laden. – NightOwl888