2016-09-13 3 views
2

私は、次のビューモデルASP.NET MVC 5 ViewModelで同時にプロパティをnull可能にする必要がありますか?

public class FormViewModel 
{ 
    [Required] 
    public DateTime? LocalFrom { get; set; } 

    [Required] 
    public DateTime? LocalTo { get; set; } 
} 

が、私はここで、次のアクション

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index([Bind(Include = "LocalFrom,LocalTo")] FormViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var presenter = new ManagePresenter(model); 
     return View(presenter); 
    } 
    return View(model); // here model.LocalFrom, model.LocalTo should be null 
} 

を持つコントローラで私のHTMLフォームがNULL可能になった場合、私はわからない

<form class="form-horizontal" action="/Manage/Index" method="post"> 

    @Html.AntiForgeryToken() 
    <div class="form-group"> 
     <label class="control-label col-sm-2" for="LocalFrom">From</label> 
     <div class="col-sm-10"> 
      <input type="datetime" class="form-control" id="LocalFrom" name="LocalFrom" value="@Model.LocalFrom" required> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-sm-2" for="LocalTo">To</label> 
     <div class="col-sm-10"> 
      <input type="datetime" class="form-control" id="LocalTo" name="LocalTo" value="@Model.LocalTo)" required> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-sm-offset-2 col-sm-10"> 
      <button type="submit" class="btn btn-primary">Submit</button> 
     </div> 
    </div> 

</form> 

である必要があり必要なプロパティは論理的なものかここではありません。私は基本的に、Model.LocalFromがヌルの場合はblankと表示され、Model.LocalFromがヌルでない場合は正しい値で表示され、入力の名前はLocalFromです。

問題

はその後ModelState.IsValidは常にfalseを返すも、私たちに必要なすべての値が存在し、有効です。

LocalFromLocalToをnullにできない場合は、ModelStateが有効になります。しかし、ビューで、私はビューにNULL値を渡すとにModelStateを正しく検証することができますどのように

enter image description here

のような時間の始まりの時間が表示されますか?

+0

これらは、次のような場合に役立ちます。http://stackoverflow.com/a/39094061/2912943およびhttp://stackoverflow.com/questions/12048838/hiding-the-default-value-for-a-date –

+0

@JeepGuillaume私は既にDateTimeプロパティをnullableにしています。しかし、問題はModelState.IsValidが常に偽であることです – Jaylen

+0

私は別のリンクを追加するために私のコメントを編集しました。 –

答えて

3

nullの値を許可する場合は、DateTimeプロパティから[Required]属性を削除する必要があります。 A [Required]属性は、値がnullにならないことを意味します。したがって、空の値(null)を送信すると、ModelStateは無効になります。

属性を削除すると、有効な日付(null)が有効になりますが、無効な日付を送信すると、無効なものとなります(ModelState)。

さらに、手動でHTMLを生成すると、正しい2方向モデルのバインディングが得られません(ビューを返すときにデフォルト値のDateTimeが表示される)。あなたのビューでは、不要な[Bind]属性を削除する必要があり、サイドノートとして

<div class="form-group"> 
    @Html.LabelFor(m => m.LocalFrom, new { @class="control-label col-sm-2" }) // assumes you add [Display(Name = "From")] to the property 
    <div class="col-sm-10"> 
     @Html.TextBoxFor(m => m.LocalFrom) 
     @Html.ValidationMessageFor(m => m.LocalFrom) 
    </div> 
</div> 

でなければなりません。ビューモデルを使用しています。つまり、オーバーポスト攻撃からすでに保護されています。

最後に、jquery.validate.jsjquery.validate.unobtrusive.jsスクリプトをビューに含めて、サーバー側の検証属性と一致するクライアント側の検証を取得し、適切なエラーメッセージがビューに表示されるようにします。

+0

jQueryライブラリに関するご意見はありますか? Microsoftはこのjquery検証プラグインhttps://jqueryvalidation.org/を使用していますか?または彼らは自分自身を持っていますか?さらに、 'jquery.validate.unobtrusive.js'とは何ですか?あるいは私のために何をしますか? – Jaylen

+0

クライアントサイド検証に必要なスクリプトは、 'jquery- {version} .js'、' jquery.validate.js'、 'jquery.validate.unobtrusive.js'です。 'IClientValidatable'(例えば' [Required] '属性)を実装するバリデーション属性を適用すると、' HtmlHelper'メソッドは一連の 'data-val- *'属性を入力用にレンダリングします。ページがレンダリングされると、 'jquery.validate.unobtrusive.js'はそれらの属性を読み込み、' jquery.validate.js'にルールを追加します.'jquery.validate.js'は入力の値をチェックし、有効でない場合はエラーメッセージを表示します。 –

関連する問題