2012-01-03 1 views
0

単純なフォームのDTOオブジェクトを取り込むHttpPostコントローラアクションがあります。ASP.NET MVC 3 - 失敗の代わりにHTTP POSTにバインドするときにDTOにnullフィールドを設定する

[HttpPost] 
public ViewResult Index(ResultQueryForm queryForm) 
{ 
    ... 
} 

public class ResultQueryForm 
{ 
    public DateTime? TimestampStart { get; set; } 
    public DateTime? TimestampEnd { get; set; } 
    public string Name { get; set; } 
} 

DTOオブジェクトには、範囲を作成するために使用されるNULL可能なdatetimeフィールドがあります。 nullableに設定されている理由は、モデルにバインドされているフォームがクエリフォームであり、ユーザーがフォームに日付値を入力する必要がないためです。

私が実行している問題は、ユーザーが無効な日付を入力すると、MVCのデフォルトモデルバインディングでエラーメッセージが表示されることです。これは、私がDateTimeを取るコントローラアクションを持っていれば完璧に起こりますか?引数として型を入力しますが、DateTimeを保持するDTOを渡すので、モデルバインディングはDateTimeを設定するだけですか?変数をnullにします。これは予期しない結果を引き起こします。

注:

[HttpPost] 
public ViewResult Index(DateTime? startDate) 
{ 
    // If the user enters an invalid date, the controller action won't even be run because the MVC model binding will fail and return an error message to the user 
} 

は、日時をバインドすることができない場合は、「失敗」するために結合MVCモデルを伝えるためにとにかくありますか?値をフォームDTOオブジェクトに渡すのではなく、nullに設定するだけです。より良い方法がありますか?個々のフォーム入力をコントローラに渡すことは、フォーム/ dtoオブジェクトの大量のプロパティのために実行不可能です(私は読みやすいようにそれらの多くを除外しています)。

+0

'ModelState.IsValid'を確認しましたか? –

答えて

1

コントローラアクションでモデルを検証できます。

if(!Model.IsValid) 
{ 
    return View(); // ooops didn't work 
} 
else 
{ 
    return RedirectToAction("Index"); //horray 
} 

もちろん、そこに必要なものを置いて、ページに表示したい場合はJsonオブジェクトを返すことができます。

また、あなたはこのようなあなたのアクションメソッドの最上部までValidateInput(true)を追加する必要があります。[HttpPost, ValidateInput(true)]

+0

ValidateInput(true)属性の機能は何ですか? – contactmatt

+0

モデルでは、検証方法を指定できます。フィールドが必要な場合は、[必須]を実行することもできます。あなたのアクションメソッドでValidateInput(false)があった場合、検証属性を尊重しません.Look @olivehour answer。あなたは素晴らしいソリューションを得るために私と彼を結合することができます。 –

+0

フォームをHTMLテキストをアクションメソッドに送信できるようにするには、[ValidateInput(false)]を入力する必要があると思っていました。私は決して私のアクションメソッドに[ValidateInput(true)]を入れていませんし、ModelState.IsValidはモデルレベルの検証エラーでもfalseを返します。 – danludwig

1

私はあなたがこのためにカスタムValidationAttributeを作成することができると思います。

関連する問題