如何接受电子邮件地址作为路线值?

时间:2010-11-29 19:40:07

标签: 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", 
       subscriber = "" }
);

我的行动是:

public ActionResult Unsubscribe(string subscriber)
{
    ...
}

没有任何参数,例如http://domain.com/Calendar/Unsubscribe/工作正常,但很快我添加了电子邮件,我得到了一个404页面:(

我有什么诀窍吗?

谢谢

6 个答案:

答案 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方法中查看电子邮件。我认为最好这样做。

祝你好运!