有没有办法在区域中使用子域名,在ASP.NET MVC中真的可行吗?
我看到了许多不同的方法,但它们都没有完全使用ASP.NET MVC基础结构:
a)使用RouteConstraint(如MVC 3 Subdomain Routing) - 它可以帮助asp.net mvc选择正确的路线,但不解决网址生成问题
b)定义自定义路由类:http://blog.tonywilliams.me.uk/asp-net-mvc-2-routing-subdomains-to-areas或http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx,两者都有url生成问题(第二个提供HtmlHelper.ActioLink扩展作为解决方案,但这只是所需内容的一小部分 - url是使用Html.BeginForm,Ajax.BeginForm,Url.Action等构建的 - 对现有代码库的过多更改+没有人会保证,新手不会忘记使用正确的扩展+不确定是否适用于T4MVC )。
c)使用网址重写规则:
<rules>
<rule name="SubDomain" stopProcessing="false">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www)(\w+)\.domain\.com$" />
</conditions>
<action type="Rewrite" url="{C:1}/{R:1}" />
</rule>
</rules>
因此,如果用户请求admin.domain.com,asp.net mvc了解domain.com/admin。 到目前为止一切都很好,问题就在于此(我实际上是在使用T4MVC,但这里有没有它的例子,不要吓唬那些从未使用它的人):
<a href="@Url.Action("Index", "Home")">
这个,根据我的路由应该去domain.com,但它给出异常“不能使用前导..退出顶层目录”。
我想是这样的,因为UrlAction尝试使用当前网址(重写后是domain.com/admin)构建网址,这会导致失败。另外我认为这只是一种方式 - 只是为了找到正确的区域/控制器/动作,而不是用于生成正确的URL。
所以问题是,有没有人双向完成(我的意思是路由到正确的区域/控制器/动作并使用标准助手生成URL,如HtmlHelper,UrlHelper)?
答案 0 :(得分:0)
首先你需要进行DNS设置。
在下面的global.asax中编写代码
public class SubdomainRoute : Route
{
public SubdomainRoute(string url, object defaults)
: base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
{ }
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
var tokens = httpContext.Request.Url.Host.Split('.');
if (tokens.Length > 1)
{
rd.Values["username"] = tokens[0];
}
return rd;
}
}