2016-05-03 19 views
-3

現在、リダイレクト用のデータと温度データを保存するためにViewDataとViewbagを使用していますが、すべて正常に動作しています。MVC4でポストバック中にコントロールの値を維持する最も良い方法は何ですか?

MVCでポストバック中にデータやコントロールの値を保存する最適な方法はありますか?

これは私のコントローラメソッドです。コントローラから動的オブジェクトを使用して表示する2つのモデルクラスを渡しています。呼ばれます

@using PagedList; 
@using PagedList.Mvc; 
@model dynamic 
@{ 
    Layout = null; 
} 
@using (Html.BeginForm("SearchMethod", "Dashboard", FormMethod.Post)) 
          { 
@foreach (Models.LCOddl item in Model.LCODDL) 
    { 
     // Render HTML 
    } 

@foreach (Models.Customer item in Model._CustomerList) 
    { 
     // render html 
    } 
<div class="form-group"><button type="submit" class="btn btn-success">Go</button></div> 

    } 

ダッシュボードコントローラからの私のかみそりビューSearchMethodからボタンのクリック後:

[HttpGet] 
    public ActionResult Index(int? page) 
    { 

     IList<Customer> _CustomerList = new List<Customer>(); 
     IList<LCOddl> LCODDL= new List<LCOddl>(); 

     // some logic to bind both classed with database .. 

     dynamic DashboardClassed = new ExpandoObject(); 
     DashboardClassed.LCODDL = LCODDL; 
     DashboardClassed.CUSTOMER = _CustomerList.ToPagedList(page ?? 1, 30); 

    return View(DashboardClassed);   

    } 

はここに動的オブジェクトを使用して、私のかみそりの図です。

今ここで私は二つのことをしたい:

  1. は、データベースと再び顧客クラスをバインドしたくない - そのために私はTempDataをを使用しています。
  2. 私はPagedListを使用してページングを維持する必要があります。

もう一度私の質問は同じですが、私はデータを格納するためにtempdataを使用するか、同じように他の最適化方法があります。

+3

「モデル」にバインドしてください。 –

+0

あなたはモデルクラスを使用してデータベースからデータを取得することを意味しますか? –

+0

データベースから一度だけ取得するか、クライアントからフォームを受け取ります。それは 'ポストバック'にあります。それが 'モデル'の仕組みです。あなたが達成しようとしていることやコードの外観を知らなくても、ここでは正確な提案はできません。 –

答えて

0

ポストバック中にフォーム値を保持する最善の方法は、ビューをview modelにバインドすることです。

私はビューモデルが何であるかにような答えを書いて、それを行くとお読みください:

What is ViewModel in MVC?

は、私たちは、ステップバイステップでそれ見ていきましょう。私はあなたが達成しようとしていることを知らないので、自分の例を使うつもりです。新しいユーザーを追加しようとしているとします。

まず、フォームデータのビューモデルを作成します。ビューモデルは、ビューに使用するデータのみを含むという点で、ドメインモデルとは異なります。ドメインモデルには多くのデータが含まれていることがありますが、すべてを追加したり編集したりする必要はありません。したがって、追加または編集するデータのみを含むビューモデルを作成します。この例では、私は私のユーザーのための最初と最後の名前を追加したいので、私は2つの性質、すなわちFirstNameLastNameを作成します。

public class UserViewModel 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

上記のビューモデルがインスタンス化され、ビューに渡されることにあなたの行動方法から。フォームが投稿されると、アクションメソッドはこのビューモデルをパラメータとして受け取ります。姓と姓の値を入力します(入力した場合)。

public class UserController : Controller 
{ 
    private IUserRepository userRepository; 

    public UserController(IUserRepository userRepository) 
    { 
      this.userRepository = userRepository; 
    } 

    public ActionResult Create() 
    { 
      UserViewModel model = new UserViewModel(); 

      return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(UserViewModel model) 
    { 
      // Do some form validation 
      if (!ModelState.IsValid) 
      { 
       return View(model); 
      } 

      // If form validation succeeds do what you need to do 
    } 
} 

作成ビューでは、このビューモデルが表示されます。あなたが行う必要があるすべては2名と姓のためのテキストボックスと送信ボタンでフォームを作成している:これは本当に基本的な例である

@model YourProjectName.ViewModels.UserViewModel 

@using (Html.BeginForm()) 
{ 
    <div> 
      @Html.TextBoxFor(m => m.FirstName, new { maxlength = "50" }) 
      @Html.ValidationMessageFor(m => m.FirstName) 
    </div> 
    <div> 
      @Html.TextBoxFor(m => m.LastName, new { maxlength = "50" }) 
      @Html.ValidationMessageFor(m => m.LastName) 
    </div> 
    <div> 
      <button type="submit">Save</button> 
    </div> 
} 

。コードを実行してシナリオに実装できるようにしてください。

+0

ありがとう@ブレンダンフォッグはこれを試して、あなたに連絡します。 –

関連する問題