0

私は 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 パラメーターがスローされないことです。

私は明らかに、後でアプリケーションのサービス層で変数の内容を再度チェックしていますが、上記のシナリオ (つまり、ユーザーがクエリ文字列を操作していて、指を切り落とす必要があります) では、コードを使用してサービス層に入る代わりに、ユーザーをエラー ページにリダイレクトします (文字列以外のデータ型で起こっていることと同じです)。

ユーザーが文字列型のクエリ文字列パラメーターの名前を操作した場合に例外をスローする方法を知っている人はいますか? それとも、これを間違った方法で回避していますか?

4

2 に答える 2

0

ほとんどの場合、これはDispatchNoteNo変数が文字列であるためです。URLで提供されていないため、空の文字列になりました。ここでは例外はスローされません。したがって、いくつかのオプションがあります。

  1. コントローラで確認しString.IsNullOrEmpty(DispatchNoteNo)、trueの場合はリダイレクトします。
  2. ルーティングを活用して->これらの値でルートを作成します。1つが欠落している場合、ルートは失敗します。今朝の構文マークアップに失敗したため、例は最後にあります...

ここで、パラメータの一方または両方が定義されていない場合、または誰かがルート制約の1つを削除した場合、このルートはリクエストと一致しません。さらに下に一致するルートがない限り、サーバーは「提供された何とか何とか何とか一致するルートがありません」(申し訳ありませんが、これの正確な表現を覚えていません)エラーを返します

routes.MapRoute("Dispatches",
                    "Controller/ReportAProblem/{DispatchNoteNo}/{DespatchNoteItemId}",
                    new { controller = "Controller", action = "ReportAProblem" }
                );
于 2012-06-26T14:35:13.310 に答える
0

これが私が思いついた回避策です。アクション メソッドでチェックインする String 型パラメーターごとに 1 行のコードが必要なため、完全ではありませんが、それが最も完璧に近い場合は受け入れます。

次の actionfilter を作成しました。

Public Class CheckStringParam
    Inherits ActionFilterAttribute

    Public Property Parameter As String
    Public Property InputValue As String

    Public Overloads Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext)
        If Parameter <> String.Empty AndAlso filterContext.ActionParameters.ContainsKey(Parameter) Then
            If filterContext.ActionParameters.TryGetValue(Parameter, InputValue) Then
                If InputValue Is Nothing Then
                    Throw (New ArgumentException)
                End If
            End If
        End If

    End Sub

End Class

基本的にはパラメータ名で呼び出されます。パラメータ名を指定し、それがアクションのコンテキスト内に存在する場合、その値を取得しようとします。成功した場合は、Nothing に設定されているかどうかを確認します。その場合、例外がスローされます。これは「HandleError」によって自動的に取得され、ユーザーはユーザー画面にリダイレクトされます。

アクション メソッドは次のようになります。

<CheckStringParam(Parameter:="DespatchNoteNo")>
<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 を操作して誤ったパラメーター名を入力すると、ユーザーはリダイレクトされます。

人々がどう思うか興味があります。

于 2012-06-26T18:59:40.173 に答える