34

最初は機能しましたが、今日は失敗しました。

これは私が日付プロパティを定義する方法です:

[Display(Name = "Date")]
[Required(ErrorMessage = "Date of Submission is required.")]        
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime TripDate { get; set; }

過去に機能してきました。しかし、今日、同じApiControllerアクションを呼び出すと:

[HttpPost]
public HttpResponseMessage SaveNewReport(TripLeaderReportInputModel model)

Firebugのレポート:

ExceptionMessage:

"Property 'TripDate' on type 'Whitewater.ViewModels.Report.TripLeaderReportInputModel' 
is invalid. Value-typed properties marked as [Required] must also be marked with
[DataMember(IsRequired=true)] to be recognized as required. Consider attributing the 
declaring type with [DataContract] and the property with [DataMember(IsRequired=true)]."

ExceptionType

"System.InvalidOperationException"

どうしたの?それらはの[DataContract]ためではありませんWCFか?私はで使用してREST WebAPIMVC4ます!

誰か助けてもらえますか?お願いします?

- -アップデート - -

私が見つけたいくつかの同様のリンクがあります。

MvC 4.0 RTMは私たちを壊しました、そして私たちはそれを修正する方法を知りませんRSS

---再度更新します---

HTTP応答ヘッダーは次のとおりです。

Cache-Control   no-cache
Connection  Close
Content-Length  1846
Content-Type    application/json; charset=utf-8
Date            Thu, 06 Sep 2012 17:48:15 GMT
Expires         -1
Pragma          no-cache
Server          ASP.NET Development Server/10.0.0.0
X-AspNet-Version    4.0.30319

リクエストヘッダー:

Accept          */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Cache-Control   no-cache
Connection          keep-alive
Content-Length  380
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Cookie          .ASPXAUTH=1FF35BD017B199BE629A2408B2A3DFCD4625F9E75D0C58BBD0D128D18FFDB8DA3CDCB484C80176A74C79BB001A20201C6FB9B566FEE09B1CF1D8EA128A67FCA6ABCE53BB7D80B634A407F9CE2BE436BDE3DCDC2C3E33AAA2B4670A0F04DAD13A57A7ABF600FA80C417B67C53BE3F4D0EACE5EB125BD832037E392D4ED4242CF6
DNT                 1
Host            localhost:39019
Pragma          no-cache
Referer         http://localhost:39019/Report/TripLeader
User-Agent          Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0
X-Requested-With    XMLHttpRequest

- - アップデート - -

私はその場しのぎの解決策を見つけました。以下の回答を参照してください。なぜそれが機能するのか、またはより良い解決策があるのか​​を誰かが理解している場合は、回答を投稿してください。ありがとうございました。

4

4 に答える 4

34

わかった。私はこのことを完全には理解していませんが。回避策が見つかりました。

Global.asax

GlobalConfiguration.Configuration.Services.RemoveAll(
    typeof(System.Web.Http.Validation.ModelValidatorProvider),
    v => v is InvalidModelValidatorProvider);

aspnetwebstackのIssueTrackerで見つけました。このページへのリンクは次のとおりです。

[DataMember(IsRequired = true)]を値型の必須プロパティに適用するための過度に積極的な検証

なぜこうなのか誰かに教えてもらえたら、あなたの洞察を答えとして投稿してください。ありがとうございました。

于 2012-09-06T18:45:51.153 に答える
13

を追加して機能さModelValidationFilterAttributeせました:

public class ModelValidationFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            // Return the validation errors in the response body.
            var errors = new Dictionary<string, IEnumerable<string>>();
            //string key;
            foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
            {
                //key = keyValue.Key.Substring(keyValue.Key.IndexOf('.') + 1);
                errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
            }
            //var errors = actionContext.ModelState
            //    .Where(e => e.Value.Errors.Count > 0)
            //    .Select(e => new Error
            //    {
            //        Name = e.Key,
            //        Message = e.Value.Errors.First().ErrorMessage
            //    }).ToArray();

            actionContext.Response =
                actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors);
        }
    }
}

[ModelValidation]アクションにフィルターを追加することもできます。またはに追加しますGlobal.asax.cs

GlobalConfiguration.Configuration.Services.RemoveAll(
typeof(System.Web.Http.Validation.ModelValidatorProvider),
v => v is InvalidModelValidatorProvider);

このように、私は引き続き元のデータ注釈を使用します。

参照

于 2012-09-20T18:03:25.217 に答える
10

更新24-5-2013:このInvalidModelValidatorProviderエラーメッセージの原因は、ASP.NETテクノロジスタックから削除されました。このバリデーターは、解決することを意図していたよりも多くの混乱を引き起こすことが証明されました。詳細については、次のリンクを参照してください:http: //aspnetwebstack.codeplex.com/workitem/270

クラスを[DataContract]属性で装飾するときは、属性でシリアル化するメンバーを明示的に装飾する必要があり[DataMember]ます。

問題は、属性DataContractSerializerをサポートしていないことです。[Required]参照型については、逆シリアル化後に値がnullでないことを確認できます。ただし、値型の場合、。なしの[Required]セマンティクスを強制する方法はありません。DataContractSerializer[DataMember(IsRequired=true)]

したがって、が送信されない場合は、DateTimeとしてマークを[Required]付けてモデル検証エラーを予期する可能性がありますが、代わりに値を取得し、検証エラーは発生しません。DateTimeDateTime.MinValue

于 2012-09-06T18:05:34.370 に答える
0

アクションの出力をXMLとして返そうとしている場合は、デフォルトのシリアライザーで必要とされるDataContractsを使用する必要があります。以前にJsonとしてアクションの出力を要求していたと思いますが、Jsonシリアライザーはデータコントラクトを必要としません。リクエストのフィドルを投稿できますか?

于 2012-09-06T18:03:30.827 に答える