2017-02-20 5 views
0

まず、私の悪い英語を申し訳ありません。私はブラジルから来ました。私は.NET MVC5の初心者です。MVC5バインドに値を追加する

モデルクラスTaskIDと4つの編集可能な列がありました。新しいTaskを作成する場合、ユーザーは2つだけ(TaskTypeSubject)を入力する必要があります。残りの2つの列(UserIDおよびCreationDate)には、システムから取得した情報(ユーザーIDおよび現在の日付)が入力されている必要があります。私はそれを見せずに、最初にこの情報を含めることを試みた

public ActionResult Create() 
{ 
    ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes(); 
    ViewBag.ApplicationUserId = User.Identity.GetUserId(); 
    ViewBag.CreationDate = DateTime.Now; 
    return View(); 
} 

とビューで作成します:次に、Createに私はViewBagで、この二つの情報を入れて、入手

まず、私はHiddenFor()を試してみましたが、DisplayFor()

@Html.LabelFor(model => model.CreationDate, "Creation Date") 
@Html.DisplayFor(model => model.CreationDate) 
@Html.HiddenFor(model => model.CreationDate) 

@Html.LabelFor(model => model.ApplicationUserId, "Creator") 
@Html.DisplayFor(model => model.User.Id) 
@Html.HiddenFor(model => model.ApplicationUserId) 

DisplayFor()で後は何も表示されません。

そして、私はポストCreate方法に

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ID,TaskTypeID,Subject,CreationDate,ApplicationUserId")] Task task) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Tasks.Add(task); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes(); 
    ViewBag.ApplicationUserId = User.Identity.GetUserId(); 
    ViewBag.CreationDate = DateTime.Now; 
    return View(tarefa); 
} 

を提出するときにModelStateは無効であるとtask.CreationDateとtask.ApplicationUserIdが空です。

この2つの情報は、作成後バインドの前にどのように含めることができますか?

または、それ以外の場合、後でModelStateを再検証する方法はありますか?あなたはViewBagを通じてビューにCreationDateApplicationUserIdを送信し、それをバック掲示されている理由を私は理解していない

か.....

+0

あなたのビューにモデルを渡すことさえありません( 'HtmlHelper'メソッドは' ViewBag'ではなくあなたのモデルのプロパティにバインドします)。しかし、いずれにせよ、これはすべて間違っている。 'ApplicationUserId'と' CreationDate'の値をGETメソッドに設定したり、ビューのフォームコントロールをインクルードしたりせずに、オブジェクトを保存する直前にPOSTメソッドでそれらを設定します。そして、[MVCのViewModelとは何ですか?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)を読むことを強くお勧めします。 –

答えて

0

、これはどんな意味がありません。誰かがhtmlを簡単に編集してApplicationUserIdまたはCreationDateを偽造することができました。

私はあなたの人生は、これのための強力な型付きのビューを使用するとはるかに簡単だと思います。

表示するすべてのものをビューモデル(ドロップダウンリスト、リストなど)に入れてください。 ここでは、SelectListItemの塗りつぶしを使用して、プルダウンでタスクの種類を表示できます(十分な場合は列挙型)。

[HttpGet] 
public ActionResult Create() 
{ 
    var viewModel = new CreateTaskViewModel 
    { 
      // [...] Put info that you need to display on the view here   
     } 

    return View(viewModel); 
} 

タスクの作成時に現在の日付とユーザーIDを取得すると、ユーザーはこの情報を偽造できません。タスクを作成した後、ユーザーに表示する場合は、Showビューを使用します。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(CreateTaskViewModel createTaskViewModel) 
{ 
    // If validation fails return to the view showing the errors 
    if (!ModelState.IsValid) { return View(createTaskViewModel); } 

    // [...] Create task object using info from viewModel 
    // and what else is necessary 

    db.Tasks.Add(task); 
    db.SaveChanges(); 

    // [...] Fills view model to show info and redirect 

    return RedirectToAction("Show", showViewModel); 
} 

モデルをビューで使用し、機密情報をHTMLに表示しないでください。あなたは勉強するために本当に役に立つことができ

@model CreateTaskViewModel 

@Html.LabelFor(model => model.TaskType) 
// Or a dropdown list 
@Html.TextBoxFor(model => model.TaskType) 

@Html.LabelFor(model => model.Subject) 
@Html.TextBoxFor(model => model.Subject) 

もう一つは、PRG(ポストリダイレクトゲット)パターンです。より複雑なアクション/ビューがある場合に便利です。

+0

これはまさに私が欲しかったものです。 。私が言ったように、私は.NET MVC5をちょうど開始しています。私はあなたの提案に従って、Post Redirect Get(PRG)パターンを調べます。本当にありがとうございます。 – Neumann

+0

@ニューマンあなたはようこそ。この質問の答えを設定することを忘れないでください;) –

関連する問題