【问题标题】:How can I accept email address as a route value?如何接受电子邮件地址作为路由值?
【发布时间】:2011-05-17 11:32:14
【问题描述】:

我怎样才能拥有这条简单的路线:

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 页面:(

我有什么诀窍吗?

谢谢

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-2 routes


【解决方案1】:

尝试在不更改路由规则的情况下将trailing slash 添加到网址http://domain.com/Calendar/Unsubscribe/my@email.com/

如果您仍想避免添加 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,以便电子邮件不是最后一个参数。

【讨论】:

  • @balexandre 这不是 MVC 问题。问题是请求甚至没有到达路由。就像你说的,卡西尼可以工作,而 IIS 不行。所以,这不能通过路由来完成。至少在不重新组织路由的情况下,该电子邮件不是最后一个,IIS 让您的应用程序处理它。如果无法做到这一点,那么最简单的解决方法是通过 IIS 管理器进行重写。
  • 你明白我的问题是 4 年前的……对吧?我确实解决了他们......是一个路线问题......
  • @balexandre 好吧,但我今天在 Win2012R2/IIS8.5/MVC5 上为这个问题打了几个小时,谷歌没有太多帮助。但是,您的问题似乎不时出现,所以我想我会提供我的解决方案,以期节省其他人的时间。哦,这次它不在路由中。这个请求从来没有那么远。
  • 感谢您提供此答案的第一部分,我遇到了类似的问题,我试图通过电子邮件地址作为路由的一部分,并且没有尾部斜杠,它会抛出 404。耶! ! :)
  • 谢谢,这行得通。如果页面上有@using (Html.BeginForm,则不会。如果您将其更改为 cshtml 中的普通 html 表单标记,则它可以工作。
【解决方案2】:

我认为应该这样做。

routes.MapRoute(
"Unsubscribe", 
"Calendar/Unsubscribe/{subscriber}", 
   new { 
   controller = "Calendar", 
   action = "Unsubscribe"
   }
    new { subscriber =  @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" }
);

【讨论】:

  • 您的正则表达式短得可怜而且不够充分;)。为了正确遵守 RFC,正则表达式绝对是巨大的(而且毫无意义)。看看这个废话:ex-parrot.com/~pdw/Mail-RFC822-Address.html !!!如果要验证电子邮件地址,最好编写一个 IConstraint 并尝试构造一个 MailAddress。 msdn.microsoft.com/en-us/library/591bk9e8.aspx
  • @spender:好吧,我相信,这里的重点不是有效电子邮件 ID 的正则表达式,而是如何将它与您的 routes 一起使用,这就是为什么我发布任何方便且可读的内容.
【解决方案3】:

我在默认家庭控制器中尝试过并且没有错误

_http://localhost: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 没有变化。

在取消订阅之前您是否定义了任何其他与相同路由匹配的路由

【讨论】:

  • nop,没问题... dang,一定有什么我看不太清楚的地方,也许明天用一双新的眼睛 :)
【解决方案4】:

尝试删除subscriber 的默认空字符串。

【讨论】:

  • 同样的错误...即使我使用subscriber = UrlParameter.Optional
【解决方案5】:

@ 符号是 URL 中的保留字符:

http://en.wikipedia.org/wiki/Percent-encoding

尝试编码;因此,您的新网址将是:

http://domain.com/Calendar/Unsubscribe/my%40email.com

【讨论】:

  • 如果我只使用a.b 就像http://domain.com/Calendar/Unsubscribe/a.b 一样,我会得到相同的404
【解决方案6】:

你不需要添加新的死记硬背!我在没有任何新路由的 Asp.Net Mvc4 应用程序中尝试了它并且它有效。您可以在Unsubscribe 方法中查看电子邮件。我认为这样做更好。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多