C # UrlHelper не возвращает желаемый URL - PullRequest
0 голосов
/ 30 января 2019

У меня есть помощник 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;
}
...