RealPath:
WebPath:
2016/11/08 17:47 (JST) 更新
掲示板作成 >>

登録フォーム整備

Contents

現在の投稿フォーム(コメント作成フォーム)を改善していきます。
img--400--size

日付を自動入力にする

日付を手打ちするのもイケてないのでこれは自動取得することにします。

投稿フォーム内の日時入力欄を削除します。
Views/Comments/Create.cshtml

<div class="form-group">
    @Html.LabelFor(model => model.Created, htmlAttributes: new { @class = "control-label col-md-2" })        
    <div class="col-md-10">        
        @Html.EditorFor(model => model.Created, new { htmlAttributes = new { @class = "form-control" } })        
        @Html.ValidationMessageFor(model => model.Created, "", new { @class = "text-danger" })        
    </div>        
</div>


<!-- すべて削除 -->

 
CommentsController.Create アクション内にて日時 (Created) を自動設定します。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,UserName,Body,Created")] Comment comment)        
{
    if (ModelState.IsValid)
    {


[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "UserName,Body")] Comment comment) // ★Id, Create は除去する
{
    comment.Created = DateTime.Now; // ★ここを追加
    if (ModelState.IsValid)
    {

詳しい解説は端折りますが、Create メソッド引数内の Bind [※1]という仕組みによってユーザ入力から来た POST 値のうちどのフィールドを Comment に適用するか、というのを決定しています。

まず、Create のフォームにおいて Id パラメータは送られていないので [Bind(Include = "Id,UserName,Body,Created")] から Id は削除します。また、今回はフォームから Created 入力部分も削ったため、Created もここから削除します。

さらに、Created をフォームから受け取ることをやめたので、ここの値をコントローラ側で設定することにしました。
comment.Created = DateTime.Now; の部分です。(本当はもっと良い設計もあるのでしょうが、これが一番楽なので今回はこれでいきます)

  • ※1. [Bind~] の他にも [HttpPost] や [ValidateAntiForgeryToken] 等の属性が付いてますが、これらについて詳しく知りたい人はこれらのキーワードの後ろに Attribute って付けてググると良いです。BindAttribute, HttpPostAttribute, ValidateAntiForgeryTokenAttribute という具合に。

結果

投稿フォームから日付入力欄が消えました。
img--400--size

適当に内容を入れて投稿を行ってみます。
img--400--size

現在日時が自動的に記録されました。
img--300--size