Odpowiedz

11

Obszary nie są bezpośrednio związane z routingiem, więc Twoje pytanie brzmi "czy obsługuje subdomenę obsługi routingu?"

Odpowiedź na to pytanie jest, niestety, nie ma wbudowanej obsługi tego.

Jednak dobrą wiadomością jest to, że wiele osób próbowało i odniósł sukces z niestandardowego kodu, które buduje na górze ułożenia:

Jeśli wymyślisz, jak kierować poddomeny bez obszarów, to robienie tego z obszarami nie powinno być trudniejsze. Przejdź do kontekstu rejestracji obszaru i użyj dowolnej techniki, którą tam wybierzesz. Obszary to tylko sposób na zgrupowanie kontrolerów i widoków - nie mają one bardzo wewnętrznego znaczenia dla samej ASP.NET MVC (robią trochę, ale nie wiele).

+1

+1 dla raczej klarownej odpowiedzi. –

5

Możesz mapować domeny lub subdomeny do Obszaru MVC2 łatwo, korzystając z modułu Przepisywania URL IIS7. Oto dwie proste reguły, które odwzorowują subdomeny na dwa Obszary. Dodałem ograniczenie, aby nie używać tej reguły, jeśli żądanie dotyczy rzeczywistego pliku (tzn. Plików CSS, JS lub obrazów).

Oto przykładowy config który przechodzi bezpośrednio w pliku web.config:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="SubA Area"> 
       <match url=".*" /> 
       <action type="Rewrite" url="/SubA/{R:0}" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="suba.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
      </rule> 
      <rule name="SubB Area"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="subb.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="/SubB/{R:0}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Będziesz musiał zmienić reguły poniżej do pracy z konkretnym przypadku zastosowania. Zwłaszcza jeśli posiadasz kontrolery w obszarze głównym, którego potrzebujesz. W takim przypadku wystarczy dodać warunek lub utworzyć nową regułę.

Pobierz modułu IIS URL Rewrite (wymagane): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

3

I wpadł na ten sam problem, a ja zbudował rozwiązanie, które pracowały dla mnie, to jest w moim blog, miejmy nadzieję, że się przydać do Ciebie.

Cheers Tony

1

Próbowałem wiele rozwiązań wymienionych na innych wątków i okazało się zbyt skomplikowane rzeczy bardzo szybko. Wygląda na to, że ASP.Net MVC chce, abyś podklasy Route wykonywał tego rodzaju zaawansowane routing, ale nigdy nie sprawdziło się to dla mnie. Nigdy nie udało mi się uzyskać domeny do mapowania do przestrzeni nazw, więc skończyłem z wyjątkami "niejednoznacznego kontrolera" (ponieważ miałem kontroler domowy w obu przestrzeniach nazw).

Ostatecznie użyłem ograniczenia do wskazania subdomen do przestrzeni nazw.

Oto, jak wygląda moja trasa. Zauważ, że ta trasa jest dla "api". subdomena:

 context.MapRoute(
      "Api_Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { controller = new SubdomainRouteConstraint("api.") }, 
      new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" } 
      ); 

Oto klasa „SubdomainRouteConstraint” mowa powyżej:

public class SubdomainRouteConstraint : IRouteConstraint 
{ 
    private readonly string SubdomainWithDot; 

    public SubdomainRouteConstraint(string subdomainWithDot) 
    { 
     SubdomainWithDot = subdomainWithDot; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri); 
    } 
} 

To oczywiście dość hack, ale jestem bardzo zadowolony z tego, jak skończyło się to proste.

Możesz łatwo napisać ten kod, aby dynamicznie mapować subdomenę do obszaru, ale mam tylko dwa obszary, więc rejestruję każdy obszar osobno. Dodatkowo daje mi to możliwość różnych tras w każdym obszarze.

+0

Niestety nie działa mnie. Mam 2 kontrolery domowe - jedna z nich jest w subdomenie. Rzutuje jak inne rozwiązania "Znaleziono wiele typów pasujących do kontrolera o nazwie" Dom ". Kiedy zmieniam nazwę na unikalną nazwę działa dobrze. Ale nie jest jasne, w jaki sposób generujesz linki do poddomeny? Próbowałem @ Html.RouteLink ("Mobile", "api_default"), ale generuje link do głównej strony aplikacji ... – Cheburek

Powiązane problemy