如何在ASP.Net MVC 3中接受电子邮件参数

时间:2011-07-17 18:27:31

标签: asp.net-mvc-3

我正在使用ASP.Net MVC 3并尝试将电子邮件地址作为参数传递到这样的URL中:

www.myapp.co.uk/customers/changedetails/john@doe.com

传入时参数值为null。如果我使用参数,那么它可以工作;

www.myapp.co.uk/customers/changedetails/?email=john@doe.com

我的控制器看起来像这样:

    public class CustomerController {

    [HttpGet]
    public ViewResult ChangeDetails(string email)
    {
      var model = GetModel(email);
       return View(model);
    }
    }

我的注册路线如下:

   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
      routes.MapRoute(
          "Default",
          "{controller}/{action}/{id}",
          new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
   }

我错过了能够将该电子邮件用作{id}参数(www.myapp.co.uk/customers/changedetails/john@doe.com)的内容吗?:

3 个答案:

答案 0 :(得分:6)

没有电子邮件作为最后的路线参数。或者如果你这样做,添加一个尾部斜杠。

/my/route/ee@mail.com -> fail
/my/route/ee@mail.com/ -> success
/my/ee@mail.com/route -> success

这背后的推理是相当复杂的,但这是关于这些事情的好文章http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

我确信,如果你最后收到电子邮件而没有尾随斜线,那么请求甚至无法到达asp.net管道。它看起来像一个文件请求。话虽如此,它的* .com扩展看起来确实非常危险。在文件名中包含@当然不会降低它的可疑性。

你可能会让它发挥作用。您可能需要放松安全性才能这样做,但几乎肯定会在某些时候中断。

因此,最好的选择是将其保留为查询字符串参数。用斜线跟踪它的第二个最佳选择。

答案 1 :(得分:1)

您需要添加另一条路线:

      routes.MapRoute(
          "ChangeEmail",
          "customers/changedetails/{email}",
          new { controller = "Customers", action = "ChangeDetails", email = UrlParameter.Optional }
      );

URL参数名称需要与操作方法参数名称匹配。

答案 2 :(得分:0)

您可以尝试将以下代码添加到web.config中。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

这是因为IIS Express认为&#34; .com&#34;作为扩展并寻找相关模块来处理它。但是,没有相关的模块,所以它调用静态模块来处理它。然后它将搜索静态内容文件路径&#34; /customers/changedetails/john@doe.com" ;,然后它报告404未找到错误。 在web.config中添加上面的代码将使您的请求包含由MVC模块而不是StaticFile模块处理的电子邮件。