Может ли кто-нибудь объяснить, как вычисляется виртуальный путь? В соответствии с параметрами RouteData.Values или в соответствии с шаблоном url?Метод GetVirtualPath в mvc
Я пытаюсь удалить некоторые значения маршрутизации, но все же виртуальный путь не изменяется. У меня есть проблема, что виртуальный обратный путь с избыточным слэш в начале URL, как:/он/контроллер/действие слэш перед тем культура является излишним ...
Я использую пользовательские маршруты вроде следующего
routes.Add("Default",
new CustomRoute("{culture}/{controller}/{action}/{id}",
new
{
controller = "Desktop",
action = "Index",
culture = "he-IL",
guid = "",
id = UrlParameter.Optional
}));
routes.Add("Wizard_" + wizard,
new CustomRoute("{guid}/{culture}/" + wizardName + "/{action}/{id}",
new
{
controller = wizard,
action = "Index",
culture = "he-IL",
guid = "",
id = UrlParameter.Optional
}));
проблема при использовании (контроллер, действие) метод Url.Action и действие в контроллере мастера, так что URL-адрес для действия мастера формат, как {GUID}/{культуры} /»+ мастер + "/ {действие}/{id} bu значение директивы пусто, а возвращаемый URL-адрес: // he-il/controller/action вместо/he-il/controller/action
CustomRoute класс:
public class CustomRoute : Route
{
private List<string> _wizards;
public CustomRoute(string uri, object defaults)
: base(uri, new RouteValueDictionary(defaults), new MvcRouteHandler())
{
_wizards = new List<string>();
FillWizards(ref _wizards);
DataTokens = new RouteValueDictionary();
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
bool hasGuid = httpContext.Request.RequestContext.RouteData != null
&& httpContext.Request.RequestContext.RouteData.Values != null
&& httpContext.Request.RequestContext.RouteData.Values.ContainsKey("guid")
&& !httpContext.Request.RequestContext.RouteData.Values["guid"].ToString().Equals(Guid.Empty);
var routeData = base.GetRouteData(httpContext);
if (routeData == null)
return null;
bool isWizard = _wizards.Contains(routeData.Values["controller"].ToString());
Debug.WriteLine("Controller: " + routeData.Values["controller"] + " action: " + routeData.Values["action"] + " Is wizard: " + isWizard + " has guid: " + hasGuid);
if (isWizard && !hasGuid)
{
if (string.IsNullOrEmpty(routeData.Values["guid"].ToString()))
{
routeData.Values["guid"] = Guid.NewGuid().ToString("N");
}
}
return routeData;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
VirtualPathData path;
path = base.GetVirtualPath(requestContext, values);
return path;
}
private void FillWizards(ref List<string> items)
{
var _configuration = ObjectFactory.GetInstance<IConfiguration>();
List<string> wizards = _configuration.GetParamValue<string>("SessionUniqueWizards", "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
items = wizards;
}
}
Пожалуйста, разместите конфигурацию маршрутизации. Вы используете метод расширения MapRoute? Вы используете пользовательские маршруты? Технически «GetVirtualPath» может вернуть все, что вам нужно, с помощью настраиваемого маршрута, поэтому покажите свой код. – NightOwl888
ok Я обновляю свой вопрос – user3132295
Пожалуйста, разместите код для класса 'CustomRoute'. – NightOwl888