2010-11-29 10 views
3

ルート値として電子メールアドレスを受け入れる方法はありますか?

routes.MapRoute(
    "Unsubscribe", 
    "Calendar/Unsubscribe/{subscriber}", 
    new { 
     controller = "Calendar", 
     action = "Unsubscribe", 
     subscriber = "" } 
); 

http://domain.com/Calendar/Unsubscribe/のようなパラメータは一切使わずに動作します。良い、しかしすぐに私は電子メールを追加する、私は 404ページを得る:(

私は何かをする必要がありますか?

ありがとう

+0

IISまたはCassini?あなたはデフォルトルートを持っていますか? –

+0

@ダリンIIS、カッシーニの下では魅力的な作品! : live url:http://julekal.dk/sony/Calendar/Unsubscribe/[email protected] – balexandre

+0

これはより一般的な問題の特定のケースです。URLパスの最後の部分がIISのファイル名のように見える場合ドットと "拡張子"を含む)、このURLを静的ファイルへのリンクとして扱います。 http://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc- and-iis – baSSiLL

答えて

0

subscriberのデフォルトは空の文字列を削除してください、ありがとうございました。

+0

同じエラー...たとえ私が 'subscriber = UrlParameter.Optional'を使用しても – balexandre

0

@記号は、URLの予約文字です:

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

それをコードてみてください。したがって、新しいURLは次のようになります。

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

私は' http://domain.com/Calendar/Unsubscribe/abのように 'ab'だけを使うと同じ' 404'を取得します' – balexandre

1

私はこれを行うべきだと思います。

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

あなたの正規表現は哀れなほど短く不十分です;)。 RFCに正しく従うために、正規表現は絶対的に巨大であり(無意味です)。このナンセンスを見てみましょう:http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html !!!電子メールアドレスを検証する場合は、IConstraintを記述してMailAddressを構築することをお勧めします。 http://msdn.microsoft.com/en-us/library/591bk9e8.aspx – spender

+1

@spender:まあ、ここでのポイントは正しい電子メールIDの正規表現ではなく、あなたの 'routes'でそれを使う方法ですそれが私が便利で読みやすいものとして何かを投稿した理由です。 –

1

私はデフォルトのホームcontrollorでそれを試してみましたが、エラーなし

_HTTPでの作業:// localhostを:64718/home/index/[email protected]

は、ASPへようこそ。 NET MVC! [email protected]

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

defaultroute-MVCでの変更はありません。

あなたは、同じルート

+0

hummm ...良い質問! 'RouteDebug'を救済するために:D – balexandre

+0

nop、行くok ...ダング、私は右、多分明日、目の新しいペアで見ていない何かがある必要があります:) – balexandre

0

新しい丸暗記を追加する必要はありませんと一致します解除する前に定義された任意の他のルートを持っています!私はAsp.Net Mvc4アプリケーションで新しいルートを使わずに試してみました。あなたはUnsubscribe方法で電子メールをチェックすることができます。私はそれをする方が良いと思います。

幸運!

4

URL http://domain.com/Calendar/Unsubscribe/[email protected]/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> 

を書き換えルールを追加することができます。また、1 Iよりも良い正規表現を書くことができ読みやすさのために提供されています。

また、電子メールが最後のパラメータでないように、/Calendar/[email protected]/Unsubscribeのようなルートパラメータの並べ替えを試みることもできます。

+0

MVCには、 ... – balexandre

+0

@balexandreこれはMVCの問題ではありません。問題はリクエストがルーティングに到達していないことです。あなたが言ったように、カッシーニは、IISは動作しません。だから、これはルートではできません。少なくとも、ルートを再編成することなく、電子メールは最後ではなく、IISはアプリケーションがそれを処理できるようにします。それができない場合、最も簡単な修正は、IISマネージャーを使って書き直すことです。 –

+0

あなたは私の質問が4年前のことだったと理解しています...そうですか?私はそれらを解決しました...ルートの問題だった... – balexandre

関連する問題