2016-03-29 2 views
0

Может ли кто-нибудь объяснить, как вычисляется виртуальный путь? В соответствии с параметрами 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; 
    } 
} 
+0

Пожалуйста, разместите конфигурацию маршрутизации. Вы используете метод расширения MapRoute? Вы используете пользовательские маршруты? Технически «GetVirtualPath» может вернуть все, что вам нужно, с помощью настраиваемого маршрута, поэтому покажите свой код. – NightOwl888

+0

ok Я обновляю свой вопрос – user3132295

+0

Пожалуйста, разместите код для класса 'CustomRoute'. – NightOwl888

ответ

0

Причина, почему ваш параметр guid отсутствует потому, что

  1. Там нет guid параметра в вызове Url.Action(action, controller).
  2. В текущем запросе есть параметр (видимо) no guid. То есть текущий маршрут, который попадает, не имеет значения guid.
  3. Вы указали значение по умолчанию для guid (guid = ""). Поскольку пустая строка - это то, что вы указали как значение по умолчанию, пустая строка - это то, что вы получаете по умолчанию.

Для правильного построения URL-адреса guid должен быть откуда-то. MVC always passes matching route values from the current request при создании исходящих URL-адресов, но так как не все ваши URL-адреса имеют guid вам нужно указать его для страниц, на которых она не существует в контексте:

Url.Action("Index", "Search", new { guid = "a565f84f9152495792d433f5bd26000f") 

Это нормальный способ сделать это. Как правило, если вы создаете ссылку для операции CRUD, вы делаете это в списке объектов.

Например, для Product сущности, вы, как правило, имеют ссылки на Edit Product и Delete Product для каждого Product в список, который будет выглядеть примерно так:

<tr> 
    <td>model.ProductName</td> 
    <td>@Html.ActionLink("Product", "Edit", new { guid = model.ProductId })</td> 
    <td>@Html.ActionLink("Product", "Delete", new { guid = model.ProductId })</td> 
</tr> 

Там также обычно быть ссылку, чтобы добавить новый объект, который не имеет идентификатора.

@Html.ActionLink("Product", "Add") 

Но из вашего примера неясно, как будет создан «волшебник». Создание нового идентификатора обычно должно быть функцией метода Add, а не маршрута.

Но, похоже, проблема в том, что вы произвольно генерируете GUID в своем маршруте, поэтому неясно, как вы ожидаете, что это значение будет поддерживаться от одного запроса к другому.

+0

Да, я знаю это, и на самом деле это мой вопрос, я написал его в своем вопросе. В случае использования Url.Action я не хочу использовать guid, так как я могу заставить метод GetVirtualPath не создавать пустой guid? – user3132295

+0

Могу ли я удалить направляющую, чтобы виртуальный путь был создан без направляющей? – user3132295

+0

Вы не можете. См. Мое обновление. Непонятно, как должен работать ваш рабочий процесс. Кто создает «волшебника»? Он вводится как объект в базе данных? Он хранится в сеансе? Что должно произойти в случае, если GUID не передан? Суть в том, что должен быть способ получить доступ к объекту мастера за пределами области маршрута, чтобы URL-адрес мог быть сгенерирован правильно с его идентификатором, но вы не указали достаточно подробных сведений о том, как ваше приложение должен работать, чтобы обеспечить полное решение. – NightOwl888

Смежные вопросы