2014-10-15 3 views
0

Наша иерархия решение выглядит следующим образом:ASP.NET MVC 4 Пользовательские Просмотр маршрутизации в Sitefinity 7

язык/врач-резюме/doctorMcr/doctorFullName

Ex: EN \ врача сорта \ 12345 \ David Теперь я хотел бы сопоставить маршрутизацию так, чтобы, когда пользователь просто набирает имя представления в URL-адресе, он автоматически сопоставляет URL-адрес с соответствующим контроллером

IE: localhost: 1234 \ en \ doctor-cv \ 12345 \ Дэвид

Должно отображаться на

Вид \ DoctorCVPage \ Index.cshtml

В настоящее время мы используем по умолчанию маршрутизации

routes.IgnoreRoute ("{ресурс} .axd/{* Pathinfo}");

 routes.MapHttpRoute(
      name: "DoctorCVPage", 
      routeTemplate: "{language}/doctor-cv/{doctorMcr}/{doctorFullName}", 
      defaults: new 
         { 
          controller = "DoctorCVPage", 
          action = "Index", 
          doctorMcr = UrlParameter.Optional, 
          doctorFullName = UrlParameter.Optional, 
          language = UrlParameter.Optional 
         }); 

Вот MyController

public class DoctorCVPageController : BaseController 
{ 
      /// <summary> 
      /// Gets or sets the message. 
      /// </summary> 
      [Category("String Properties")] 
      public string Message { get; set; } 

      /// <summary> 
      /// This is the default Action. 
      /// </summary> 
      public ActionResult Index(string doctorMcr) 
      { 
       var id = ""; 
       ViewBag.PageTitleLink = Request.UrlReferrer != null ? Request.UrlReferrer.ToString() : string.Empty; 
      } 
    } 

А потом на мой взгляд, у меня есть тег.

<a href="/en/doctor-cv/${DoctorMcr}/${DoctorName}"/> 

После нажатия пользователя на этой метке, система должна перенаправить DoctorCVPage/Index (контроллер: DoctorCVPage, Action = Index), но он не может это сделать.

Пожалуйста, помогите мне узнать, почему, благодарю за помощь.

ответ

2

Пожалуйста, следуйте этому пути, я думаю, он может помочь вам справиться с этой задачей.

protected override void HandleUnknownAction(string actionName) 
    { 
     UrlDetail = Request.Url != null ? Request.Url.ToString() : string.Empty; 

     Response.StatusCode = (int)HttpStatusCode.OK; 
     this.ActionInvoker.InvokeAction(this.ControllerContext, "Index"); 
     return;    
    } 

public ActionResult Index() 
    { 
     return; 
    } 

Надеюсь, что этот способ может вам помочь.

1

Это не работает, потому что любой URL-адрес в Sitefinity будет перенаправлен на страницу. Ваш виджет - это не страница, а страница. Что вам нужно сделать, это переопределить метод HandleUnknownAction и проанализировать URL-адрес там, а затем предпринять соответствующие действия.

Например

protected override void HandleUnknownAction(string actionName) 
{ 
    if (!RouteHelper.GetUrlParametersResolved()) 
    { 
     this.Response.StatusCode = (int)HttpStatusCode.NotFound; 
    } 
    else 
    { 
     this.Response.StatusCode = (int)HttpStatusCode.OK; 
     List<string> segments = RouteHelper.SplitUrlToPathSegmentStrings(Request.Url.LocalPath, true) 
              .Skip(1) 
              .ToList(); 
     ViewBag.PageTitleLink = String.IsNullOrEmpty(segments.ElementAt(2)):String.Empty:segments.ElementAt(2); 
     var lang = segments.ElementAt(0); 
     // etc 

     View("Index", model).ExecuteResult(this.ControllerContext); 
    } 
} 

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

+0

Большое спасибо за помощь, но это не работает для меня. – David