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>