Как я могу принять адрес электронной почты в качестве значения маршрута? - PullRequest
3 голосов
/ 29 ноября 2010

Как мне получить этот простой маршрут:

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 ]

5 голосов
/ 26 марта 2014

Попробуйте добавить trailing slash к URL-адресу 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, чтобы электронное письмо не было последним параметром.

1 голос
/ 29 ноября 2010

Я попробовал его в стандартном домашнем контроллере и работал без ошибок

_ http://localhost:64718/home/index/a.b@email.com

Добро пожаловать в ASP.NET MVC!ab@email.com

public ActionResult Index(string id)    
{    
    ViewModel.Message = "Welcome to ASP.NET MVC!   " + id;    
    return View();    
}

Нет изменений в defaultroute-MVC.

У вас есть какие-либо другие маршруты, определенные до отмены подписки, которые будут соответствовать тому же маршруту

1 голос
/ 29 ноября 2010

Я думаю, что это должно сделать.

routes.MapRoute(
"Unsubscribe", 
"Calendar/Unsubscribe/{subscriber}", 
   new { 
   controller = "Calendar", 
   action = "Unsubscribe"
   }
    new { subscriber =  @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" }
);
0 голосов
/ 02 августа 2012

вам не нужно добавлять новый rote!Я попробовал это в приложении Asp.Net Mvc4 без каких-либо новых маршрутов, и это сработало.Вы можете проверить электронную почту в Unsubscribe Метод.Я думаю, что лучше сделать это.

удачи!

0 голосов
/ 29 ноября 2010

Символ @ является зарезервированным символом в URL:

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

Попробуйте кодировать его; Таким образом, ваш новый URL будет:

http://domain.com/Calendar/Unsubscribe/my%40email.com
0 голосов
/ 29 ноября 2010

Попробуйте удалить пустую строку по умолчанию для subscriber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...