我怎样才能拥有这条简单的路线:
http://domain.com/Calendar/Unsubscribe/my@email.com
我的路线如下:
routes.MapRoute(
"Unsubscribe",
"Calendar/Unsubscribe/{subscriber}",
new {
controller = "Calendar",
action = "Unsubscribe",
subscriber = "" }
);
我的行动是:
public ActionResult Unsubscribe(string subscriber)
{
...
}
没有任何参数,例如http://domain.com/Calendar/Unsubscribe/
工作正常,但很快我添加了电子邮件,我得到了一个404
页面:(
我有什么诀窍吗?
谢谢
答案 0 :(得分:5)
尝试在不更改路由规则的情况下向网址http://domain.com/Calendar/Unsubscribe/my@email.com/添加trailing slash
。
如果您仍想避免添加trailing slash
并且可以使用URL重写,则可以在web.config中添加重写规则
<system.webServer>
<rewrite>
<rules>
<rule name="Fix Unsubscribe emails route" stopProcessing="true">
<match url="^(Calendar/Unsubscribe/.*@.*)$" />
<action type="Rewrite" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
为了便于阅读,您还可以编写一个比我提供的更好的正则表达式。
您也可以尝试重新排序路线参数,例如/Calendar/my@email.com/Unsubscribe,以便电子邮件不是最后一个参数。
答案 1 :(得分:1)
我认为应该这样做。
routes.MapRoute(
"Unsubscribe",
"Calendar/Unsubscribe/{subscriber}",
new {
controller = "Calendar",
action = "Unsubscribe"
}
new { subscriber = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" }
);
答案 2 :(得分:1)
我在默认的家庭控制器中尝试过它并且没有错误
_http://本地主机:64718/home/index/a.b@email.com
欢迎使用ASP.NET MVC! a.b@email.com
public ActionResult Index(string id)
{
ViewModel.Message = "Welcome to ASP.NET MVC! " + id;
return View();
}
defaultroute-MVC没有变化。
在Unsubscribe之前是否有任何其他路线定义,这些路线将匹配相同的路线
答案 3 :(得分:0)
尝试删除subscriber
的默认空字符串。
答案 4 :(得分:0)
@符号是URL中的保留字符:
http://en.wikipedia.org/wiki/Percent-encoding
尝试编码;因此,您的新网址将是:
http://domain.com/Calendar/Unsubscribe/my%40email.com
答案 5 :(得分:0)
你不需要添加新的死记硬背!我在Asp.Net Mvc4应用程序中尝试了它,没有任何新的路由,它工作。您可以在Unsubscribe
方法中查看电子邮件。我认为最好这样做。