私は MVC 3 と vs2010 と VB.NET を使用しています。私はコントローラーで「HandleError」を使用しています。これはうまく簡単に機能し、未処理の例外を自動的に検出し、ユーザーを選択したエラーページにリダイレクトします。ただし、問題があります。
私が使用しているアクションメソッドの例を次に示します。
<HandleError>
Public Function ReportAProblem(DespatchNoteNo As String, DespatchNoteItemId As Long) As ActionResult
Dim uiview As New PickingReportAProblemVM(DespatchNoteNo, DespatchNoteItemId)
' Get the data for ReportAProblem
GetDataForReportAProblem(uiview)
Return View(uiview)
End Function
ユーザーが次の方法で URL を操作すると、例外が自動的にスローされ、ユーザーはエラー ページにリダイレクトされます。
- .../?DespatchNoteNo=DN1234&DespatchNoteItemId=A (DespatchNoteItemId のデータ型が正しくありません)
- .../?DespatchNoteNo=DN1234&DespatchNoteItem=1 (DespatchNoteItemId のパラメータ名が正しくありません)
例外が自動的にスローされたようです (間違っている場合は修正してください)。これは HandleError によって検出され、ユーザーはエラー ページにリダイレクトされます。
ただし、ユーザーが次のように入力した場合:
- .../?DespatchNote=DN1234&DespatchNoteItemId=1 (DespatchNote のパラメーター名が正しくありません)
スローされた例外はないようです (間違っている場合は修正してください)。ユーザーはエラー ページにリダイレクトされませんが、代わりにコードが続行されます。
デバッグ中に確認できる限り、アクション メソッドが呼び出されると、上記のすべてのシナリオでパラメーターの値が Nothing に設定されます。繰り返しになりますが、違いは、String 以外のタイプのパラメーターの場合、例外がスローされ、タイプ String の APART FROM パラメーターがスローされないことです。
私は明らかに、後でアプリケーションのサービス層で変数の内容を再度チェックしていますが、上記のシナリオ (つまり、ユーザーがクエリ文字列を操作していて、指を切り落とす必要があります) では、コードを使用してサービス層に入る代わりに、ユーザーをエラー ページにリダイレクトします (文字列以外のデータ型で起こっていることと同じです)。
ユーザーが文字列型のクエリ文字列パラメーターの名前を操作した場合に例外をスローする方法を知っている人はいますか? それとも、これを間違った方法で回避していますか?