Asp.net mvc 我如何接受电子邮件地址作为路由值?
我怎样才能有这个简单的路线:Asp.net mvc 我如何接受电子邮件地址作为路由值?,asp.net-mvc,asp.net-mvc-2,routes,Asp.net Mvc,Asp.net Mvc 2,Routes,我怎样才能有这个简单的路线: http://domain.com/Calendar/Unsubscribe/my@email.com 我有一条路线看起来像: routes.MapRoute( "Unsubscribe", "Calendar/Unsubscribe/{subscriber}", new { controller = "Calendar", action = "Unsubscribe", subscrib
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
页面:(
我有什么把戏要做吗?
谢谢尝试删除订户的默认空字符串符号是URL中的保留字符: 尝试对其进行编码;因此,您的新url将是:
http://domain.com/Calendar/Unsubscribe/my%40email.com
我想这应该可以
routes.MapRoute(
"Unsubscribe",
"Calendar/Unsubscribe/{subscriber}",
new {
controller = "Calendar",
action = "Unsubscribe"
}
new { subscriber = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" }
);
我在默认主控器中进行了尝试,没有出现错误 _http://localhost:64718/home/index/a.b@email.com 欢迎使用ASP.NETMVC!a。b@email.com defaultroute MVC中没有更改
在取消订阅之前,您是否定义了任何其他路由,这些路由将与相同的路由匹配?您不需要添加新的死记硬背!我在Asp.Net Mvc4应用程序中尝试了它,但没有任何新路由。您可以在
取消订阅
方法中查看电子邮件。我认为这样做更好
祝你好运!在不更改路由规则的情况下,尝试在url中添加一个
尾随斜杠
如果您仍然希望避免添加尾随斜杠
,并且有可用的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/取消订阅,使电子邮件不是最后一个参数。如果我只使用a.b
像http://domain.com/Calendar/Unsubscribe/a.b
相同的错误…即使我使用subscriber=UrlParameter。可选IIS或Cassini?你有默认的路径吗?@Darin IIS,在Cassini的控制下,就像一个符咒一样工作!:(live url:这是一个更普遍的问题的具体案例:如果url路径的最后一部分看起来像IIS的文件名(包含点和“扩展名”),那么它会将此url视为指向静态文件的链接。你的正则表达式非常短且不充分;).为了正确遵守RFC,正则表达式绝对是巨大的(而且毫无意义)。看看这句废话:!!!如果你想验证电子邮件地址,最好写一个IConstraint并尝试构造一个邮件地址。@spender:嗯,我相信,这里的重点不是有效电子邮件id的正则表达式,而是如何将它用于你的路由
,这就是为什么我发布了任何被认为是conveni的东西ent和readable.nop,一切正常……当,一定有什么我看不清楚的地方,也许明天会有一双新的眼睛:)@balexandre这不是MVC的问题。问题是请求甚至没有到达路由。就像你说的,卡西尼号有效,而不是。因此,这不能通过路线来实现。至少在没有重新组织路由的情况下是这样,电子邮件不是最后一封,IIS让你的应用程序处理它。若不能做到这一点,那个么最简单的修复方法是通过重写,这可以通过IIS管理器来完成。你们知道我的问题是4年前。。。正确的?我确实支持他们。。。这是一个路线问题…@balexandre很确定,但我今天在Win2012R2/IIS8.5/MVC5上就这个问题争论了几个小时,对谷歌没有多少帮助。然而,你的问题似乎时不时出现,所以我想我会给出我的解决方案,希望能节省其他人的时间。哦,这一次它不在路由中。这个请求从来没有这么远。感谢这个答案的第一部分,我遇到了一个类似的问题,我试图通过一个电子邮件地址作为路由的一部分,没有尾部斜杠,它抛出了一个404。耶!!:)谢谢,这很有效。如果页面上有一个@using(Html.BeginForm
,则不会。如果您将其更改为cshtml中的一个普通Html表单标记,则它可以工作。
<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>