У меня есть помощник MvcHtmlString, который использует UrlHelper, однако в одном случае URL не возвращает желаемый URL, и я не знаю, почему.
Если я звоню _Navigation.cshtml
, например @Html.Partial("_Navigation", Model)
через контроллер иллюстраций, я получаю URL /Admin/Illustrations/Test/11979?documentId=12242&customerId=8
, но если я звоню _Navigation.cshtml
, через HomeController я получаю URL /Home/Test/11979/12242/8
Почему URL-адрес области администратора представляет строку запроса?
См. Мой код ниже:
RouteConfig.cs
routeCollection.MapRoute("Test", "{controller}/{action}/{id}/{documentId}/{customerId}", new { controller = "Home", action = "Test", documentId = UrlParameter.Optional, customerId = UrlParameter.Optional });
routeCollection.MapRoute("AdminTest", "Admin/{controller}/{action}/{id}/{documentId}/{customerId}", new { controller = "Illustrations", action = "Test", documentId = UrlParameter.Optional, customerId = UrlParameter.Optional }, new[] { "Documents.Areas.Admin.Controllers" });
HomeController.cs
public ViewResult Test(int id, int? documentId, int? customerId)
{
return View();
}
Иллюстрации Контроллер
public ViewResult Test(int id, int? documentId, int? customerId)
{
return View();
}
_Navigation.cshtml
var controller = ViewContext.RouteData.GetRequiredString("controller");
var isHome = controller == "Home";
@Html.MenuLink("Test", isHome ? "Home" : "Illustrations", "Test", isHome ? null : "Admin", "Test", new { id = Model.Id, documentId = Model.DocumentId, customerId = Model.CustomerId })
HtmlExtender.cs
public static MvcHtmlString MenuLink(this HtmlHelper htmlHelper, string linkText, string controller, string action, string area, string anchorTitle, object routeValues)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var routeValueDictionary = new RouteValueDictionary(routeValues);
var url = urlHelper.Action(action, controller, routeValueDictionary);
var anchor = new TagBuilder("a") {InnerHtml = HttpUtility.HtmlEncode(linkText.ToUpper())};
anchor.MergeAttribute("href", url);
anchor.Attributes.Add("title", anchorTitle);
var listItem = new TagBuilder("li") {InnerHtml = anchor.ToString(TagRenderMode.Normal)};
if (CheckForActiveItem(htmlHelper, controller, action, area))
{
listItem.Attributes.Add("class", "active");
}
return MvcHtmlString.Create(listItem.ToString(TagRenderMode.Normal));
}
private static bool CheckForActiveItem(HtmlHelper htmlHelper, string controller, string action, string area)
{
if (!CheckIfTokenMatches(htmlHelper, area, "area"))
{
return false;
}
return CheckIfValueMatches(htmlHelper, controller, "controller") && CheckIfValueMatches(htmlHelper, action, "action");
}
private static bool CheckIfTokenMatches(HtmlHelper htmlHelper, string item, string dataToken)
{
var routeData = (string)htmlHelper.ViewContext.RouteData.DataTokens[dataToken];
if (dataToken == "action" && item == "Index" && string.IsNullOrEmpty(routeData)) return true;
if (dataToken == "controller" && item == "Home" && string.IsNullOrEmpty(routeData)) return true;
if (routeData == null) return string.IsNullOrEmpty(item);
return routeData == item;
}