1

私は ASP.NET Web API で Web API を作成しており、次のビュー モデルを利用しています。特定のプロパティに 2 つの検証属性 ([Required] と [StringLength(10)]) がある場合、データ バインディングに問題があるようです。

JSON 値をクライアントから次の形式のコントローラー アクションにポストする場合:

// POST API/リスト

public void Post([FromBody] TaskViewModel taskVM)

私は次のことを観察します。

  • 複数の属性の 1 つを削除すると、すべてが正常にバインドされます。
  • 複数の属性を残すと、クライアントは 500 内部サーバー エラーを受け取り、Post メソッドの本体に到達しません。

なぜこれが起こるのですか?乾杯

public class TaskViewModel
{

    //Default Constructor
    public TaskViewModel() { }


    public static TaskViewModel MakeTaskViewModel(Task task) 
    {
        return new TaskViewModel(task);
    }

    //Constructor
    private TaskViewModel(Task task)
    {
        this.TaskId = task.TaskID;
        this.Description = task.Description;
        this.StartDate = task.StartDate;
        this.Status = task.Status;
        this.ListID = task.ListID;
    }

    public Guid TaskId { get; set; }

    [Required]
    [StringLength(10)]
    public string Description { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public System.DateTime StartDate { get; set; }

    [Required]
    public string Status { get; set; }        

    public System.Guid ListID { get; set; }       
}
4

1 に答える 1

4

500 内部サーバーの内部を検査する必要があります

  • web.configでcustomerrorをオフにしてください
  • web.API をセルフホストする場合は、設定する必要がありますGlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  • ブラウザ開発コンソールのネットワーク タブを使用するか (IE では、Chrome では F12 でコンソールを取得できます)、FireFox を使用している場合は、FireBug またはFiddlerなどのサード パーティ ツールを使用します。

次に、サーバーで何が問題だったのかを確認し、さらに問題を解決することができます.

あなたの場合、これは応答にあります:

"Message":"エラーが発生しました。","ExceptionMessage":"タイプ ' MvcApplication3.Controllers.TaskViewModel ' のプロパティ 'StartDate' が無効です。IsRequired=true)] が必須として認識されるようにするには、[DataContract] で宣言型を、[DataMember(IsRequired=true)] でプロパティを属性付けすることを検討してください。","ExceptionType":"System.InvalidOperationException"

したがって、問題は2つの属性があることではなく、[Required]これを解決するためにプロパティにマークを付けたことで、例外が何をすべきかを教えてくれます。

[DataMember(IsRequired=true)]プロパティの型が値の型 (例: int、datatime など) である必要なプロパティに追加する必要があります。

したがって、次のように変更TaskViewModelします。

[DataContract]
public class TaskViewModel
{

    //Default Constructor
    public TaskViewModel() { }

    [DataMember]
    public Guid TaskId { get; set; }

    [Required]
    [DataMember]
    [StringLength(10)]
    public string Description { get; set; }

    [Required]
    [DataMember(IsRequired = true)]
    [DataType(DataType.DateTime)]
    public System.DateTime StartDate { get; set; }

    [Required]
    [DataMember]
    public string Status { get; set; }

    [DataMember]
    public System.Guid ListID { get; set; }
}

いくつかの補足事項:

  • を使用するには、System.Runtime.Serialization dll を参照する必要があります。DataMemberAttribute
  • クラスをマークする必要があり、必要な[DataContract]プロパティだけでなく、そのすべてのプロパティをマークする必要があり[DataMember]ます。
于 2013-01-24T12:00:59.267 に答える