2014-07-08 7 views
5

muszę przekierować do ścieżki w ramach obecnego modułu:Nancy przekierować na trasie w ramach obecnego modułu

modulePath = "/test"; 
Get["/there"] = ... 
Get["/here"] = routeParams => { return ????????????("/there"); } 

spodziewam „/ test/tutaj” przekierować do „/ test/tam”

+6

'powrócić Response.AsRedirect ("/ test/nie");' – Phill

+0

jest to możliwe, aby to zrobić bez podania ścieżki modułu? ("/ test") –

+0

Nie, to niemożliwe. – Phill

Odpowiedz

10

Możesz używać nazwanych tras i Nancy.Linker. Zobacz https://github.com/horsdal/Nancy.Linker

To zainstalować Nancy.Linker z Nuget, wziąć zależność od IResourceLinker i zmienić kod do:

public class YourModule 
{ 
    public YourModule(IResourceLinker linker) 
    { 
     Get["theRoute", "/there"] = ... 
     Get["/here"] = Response.AsRedirect(linker.BuildAbsoluteUri(this.Context, "theRoute"); 
    } 
{ 
0

Można używać BaseModule. Pozwoli Ci to uporządkować swoją aplikację internetową na luźno powiązane jednostki, z powiązanymi elementami w tym samym folderze: moduły, widoki, zasoby statyczne. Osiąga się to poprzez zarejestrowanie przestrzeni nazw modułu (z pominięciem nazwy projektu) jako 1) modulePath, 2) lokalizacji wyszukiwania dla widoków i 3) dozwolonej lokalizacji dla zawartości statycznej.

Jako takie, przechodzisz (powrót) do adresów URL mapujących strukturę folderów projektu. Przedmioty, nad którymi prawdopodobnie będziesz pracować razem, i usuwane razem, żyją razem. Tworzenie linków do rzeczy jest znacznie uproszczone. Więc dla przekierowania, można mieć strukturę folderów

 
here 
|-module.cs 
|-there 
    |-module.cs 

oraz w „tutaj” modułu po prostu return Response.AsRedirect("there/"); Aby to działało, moduły powinny dziedziczyć z poniższego BaseModule i nie zmienić domyślnej przestrzeni nazw swoich modułów. Mapuje do folderu.

using Nancy; 
using Nancy.Conventions; 
using System; 
using System.Text.RegularExpressions; 

namespace HaciendaTestClient 
{ 
    // http://stackoverflow.com/questions/2287636/pass-current-object-type-into-base-constructor-call 
    public abstract class BaseModule<T> : NancyModule, IConvention 
    { 
     // the goal is to provide the folder path from the app root as the module path, to enable relative links to static content. 
     public BaseModule() : base(typeof(T).Namespace.Substring(typeof(T).Namespace.IndexOf('.')).Replace('.', '/')) 
     { 
     } 

     public void Initialise(NancyConventions conventions) 
     { 
      // This is where we register the top level directory containing the module as a root for static content. 
      var tlf = Regex.Match(typeof(T).Namespace, "(?<=\\.)[^\\.]*", RegexOptions.Singleline).Value; 
      var conv = StaticContentConventionBuilder.AddDirectory(tlf); 
      conventions.StaticContentsConventions.Add(conv); 
     } 

     public Tuple<bool, string> Validate(NancyConventions conventions) 
     { 
      return new Tuple<bool, string>(true, "no problem joe"); 
     } 
    } 
} 

Oto mały zrzut ekranu mojego eksploratora rozwiązań, który Cię zainteresuje. Ponieważ wszystko jest wywoływane za pomocą odnośników, wszystko można nazwać "_". Lokalizacja staje się identyfikatorem. I nie jest kruchy. Foldery można przenosić, zmieniać ich nazwy i zagnieżdżać. Zwróć uwagę, że przestrzenie nazw odpowiadają! Skały Nancy.

enter image description here

Powiązane problemy