2

私はasp.net web-apiを使用しており、2つの状況をキャッチしようとしています:

  1. 未定義の Uri パラメータが渡されました
  2. Uri パラメーターに無効な値が渡されました

パラメーターと値は正常にバインドされますが、名前または値のいずれかが無効な場合、例外は発生せず、null が渡されます。

詳細:
ModelState.IsValid常に true
すべてのフォーマッタをクリアしGlobalConfiguration.Configuration.Formatters.Clear(); ました継承された XmlMediaTypeFormatter を使用して追加し、これを設定しますXmlSerializer = true
また、複雑な型にはスキーマ生成クラス (xsd ツール) を使用しています

これは、コントローラー メソッドのシグネチャです。

public Messages GetMessages(int? startId = null, int? endId = null, DateTime? startDate = null, DateTime? endDate = null, int? messageType = null, string clientId = "", bool isCommentsIncluded = false)

何か案は?

4

1 に答える 1

2

クラスを作成し、検証する属性を装飾します。例 (もちろん、独自の値を使用してください)

public class ModelViewModel
{
    public int Id { get; set; }
    [Required]
    public int RelationshipId { get; set; }
    [Required]
    public string ModelName { get; set; }
    [Required]
    public string ModelAttribute { get;set; }
}

フィルターを作成して、すべてのコントローラーで Model.IsValid を使用する必要がないようにします。

public class ValidationFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid)
            actionContext.Response = actionContext.Request
                 .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
    }
}

最後に、Global.asax の Application_Start() に以下を追加します。

GlobalConfiguration.Configuration.Filters.Add(new ValidationFilter());

お役に立てれば。

アップデート

public Messages GetMessages([FromUri] ModelViewModel model)

モデルクラスは、この質問をチェックアウトする uri の値にバインドされます

于 2013-09-08T16:49:47.870 に答える