2017-04-06 7 views
3

エンティティタイプの2つのリストが含まれていますが、Statusプロパティの値によってのみ区別されます。 Ordersが作成されると、statusプロパティはIn ProgressAdminOrders viewに自動的に設定され、Orders In Progress tableに配置されます。 AdminOrders viewにはOrders In Progress tableOrders Dispatched tableの2つのテーブルがあり、それぞれModelのリストで埋められます。それにモデルを渡す - 新規受注のStatus値がdispatchedにドロップダウンリストから変更され、ビュー内のupdateボタンがクリックされたときに、POSTリクエストがトリガされなければならない変更されたフォーム入力値からエンティティを更新するポストメソッドでモデルが渡されない

。しかし、私がAdminOrdersメソッドをデバッグすると、modelパラメータはnullになります。

は、こちらのモデルクラスです:これらは、コントローラのアクションです

public class AdminOrdersViewModel 
{ 
    public List<Order> OrdersInProgress { get; set; } 
    public List<Order> OrdersDespatched { get; set; } 
} 

Get要求AdminOrders方法で

[HttpGet] 
[Authorize(Roles = "Admin")] 
public ActionResult AdminOrders() 
{ 
    var model = db.Orders.Where(o => o.Status == "In Progress").ToList(); 
    var model2 = db.Orders.Where(o => o.Status == "Despatched").ToList(); 

    return View(new AdminOrdersViewModel { OrdersInProgress = model, OrdersDespatched = model2 }); 
} 

[HttpPost] 
[Authorize(Roles = "Admin")] 
public async Task<ActionResult> AdminOrders([Bind(Include = "OrdersInProgress, OrdersDespatched")] AdminOrdersViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     foreach (var item in model.OrdersDespatched) 
     { 
      db.Entry(item).State = EntityState.Modified; 
     } 

     foreach (var item2 in model.OrdersInProgress) 
     { 
      db.Entry(item2).State = EntityState.Modified; 
     } 

     await db.SaveChangesAsync(); 

     var ordersInProgress = db.Orders.Where(o => o.Status == "In Progress").ToList(); 
     var ordersDespatched = db.Orders.Where(o => o.Status == "Despatched").ToList(); 

     return View(new AdminOrdersViewModel { OrdersDespatched = ordersDespatched, OrdersInProgress = ordersInProgress }); 
    } 

    return View(model); 
} 

、各モデルリストのエンティティが更新され、新しいモデルがに与えられていますビューが返されたときに表示するので、ステータスプロパティに応じてページが更新され、注文が正しいテーブルに移動されます。ただし、モデルはnullのままです。私もモデルのリストを個別形式で割り当てられたとPostメソッドに二つの新しいリストを渡すことを試みた

@using (Html.BeginForm("AdminOrders", "Manage", new { model = Model }, FormMethod.Post, new 
    { 
     enctype = "multipart/form-data" 
    })) 
    { 
    } 

ビューのフォームは、POSTメソッドモデルパラメータにビューのモデルを割り当て要求しますが、エラーを受け取ります。投稿のリクエストが更新されたモデルを投稿メソッドAdminOrdersに渡すようにするにはどうすればよいですか?

フルビューページのコードは以下の通りです:

@model ValueVille.Models.AdminOrdersViewModel 

@{ 
    ViewBag.Title = "Orders"; 

} 

<div class="main-content-container"> 

    <h1>New Orders In Progress</h1> 
@using (Html.BeginForm("AdminOrders", "Manage", new { model = Model }, FormMethod.Post, new 
{ 
    enctype = "multipart/form-data" 
})) 
{ 
     @Html.AntiForgeryToken() 

     <table class="panel panel-default table cart-table"> 
      <tr> 
       <th> 
        Order ID 
       </th> 
       <th> 
        Total 
       </th> 
       <th> 
        Date 
       </th> 
       <th> 
        Status 
       </th> 
      </tr> 
      @foreach (var item in Model.OrdersInProgress) 
      { 
       <tr> 
        <td> 
         <a href="@Url.Action("OrderDetails", "Home", new { id = item.OrderId })"> 
          @item.OrderId 
         </a> 
        </td> 
        <td> 
         £@item.Total 
        </td> 
        <td> 
         @item.OrderDate 
        </td> 
        <td> 
         @{ 
          List<SelectListItem> listItems = new List<SelectListItem>(); 
          listItems.Add(new SelectListItem 
          { 
           Text = item.Status, 
           Value = "Option1" 
          }); 
          listItems.Add(new SelectListItem 
          { 
           Text = "Despatched", 
           Value = "Option2", 

          }); 

         } 

         @Html.DropDownListFor(m => item.Status, listItems, item.Status) 
        </td> 
       </tr> 
          } 

     </table> 

     <h1>Orders Despatched</h1> 

     <table class="panel panel-default table cart-table"> 
      <tr> 
       <th> 
        Order ID 
       </th> 
       <th> 
        Total 
       </th> 
       <th> 
        Date 
       </th> 
       <th> 
        Status 
       </th> 
      </tr> 
      @foreach (var item in Model.OrdersDespatched) 
      { 
       <tr> 
        <td> 
         <a href="@Url.Action("OrderDetails", "Home", new { id = item.OrderId })"> 
          @item.OrderId 
         </a> 
        </td> 
        <td> 
         £@item.Total 
        </td> 
        <td> 
         @item.OrderDate 
        </td> 
        <td> 
         @{ 
          List<SelectListItem> listItems = new List<SelectListItem>(); 
          listItems.Add(new SelectListItem 
          { 
           Text = item.Status, 
           Value = "Option1" 
          }); 
          listItems.Add(new SelectListItem 
          { 
           Text = "Despatched", 
           Value = "Option2", 

          }); 

         } 

         @Html.DropDownListFor(m => item.Status, listItems) 
        </td> 
       </tr> 
          } 

     </table> 

     <div class="panel-body form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Update" class="btn btn-success" /> 
      </div> 
     </div> 

          } 



</div> 
+0

リストを個別に渡そうとすると、どのようなエラーが発生しますか? –

+0

また、ドロップダウンリストはどのように表示されますか?それらの名称は何ですか? –

+0

質問を更新して、フルビューのページコードを追加しました。個別にリストを渡すときにエラーはありませんが、ポストリクエストで渡されるリストは空です。したがって、ModelStateは無効です。 – naz786

答えて

-1

さて、私はasp.net MVCで、何らかの理由で

...あなたがやっているものを見ているが、このように思えるはず仕事:

@using (Html.BeginForm("AdminOrders", "Manage", new { model = Model }, FormMethod.Post, new 
{ 
    enctype = "multipart/form-data" 
})) 
{ 
//Form contents 
} 

モデルを正しく通過していますか?まあ、それは動作しないので、私はないと思います。

@using (Html.BeginForm("AdminOrders", "Manage", new { model = Model }, FormMethod.Post, new 
{ 
    enctype = "multipart/form-data" 
})) 
{ 
    @Html.HiddenFor(x => x.OrdersInProgress) 
    @Html.HiddenFor(x => x.OrdersDespatched) 
} 

そして、コントローラのアクションで二つのリストを取るためにそれを設定する:あなたがしなければならない何

はこのような何か(フォームに2つの隠しフィールドを追加)です。

複雑なオブジェクト(ポコスなど)をコントローラに渡そうとしたときにこの問題が発生しましたが、名前が付けられたオブジェクトを正確に含める必要があり、コントローラが予期しているものと一致する必要があります。だからOrdersInProgressと呼ばれるList<Order>がある場合、正確な名前のそのタイプのリストを受け入れるコントローラーに、その正確な名前のタイプのリストを渡す必要があります。フォーム内の非表示のコントロールは、その名前のリストを渡す必要があります。そのリストが空になったら、名前が正しいことを確認します。

+0

これは私の質問には答えませんが、お試しいただきありがとうございます。 – naz786

1

にあなたのViewModelを変更します。

@model ValueVille.Models.AdminOrdersViewModel 
@{ 
    ViewBag.Title = "Orders"; 
} 

<div class="main-content-container"> 
    <h1>New Orders In Progress</h1> 
    @using (Html.BeginForm("AdminOrders", "Manage", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
     @Html.AntiForgeryToken() 

     <table class="panel panel-default table cart-table"> 
      <thead> 
       <tr> 
        <th>Order ID</th> 
        <th>Total</th> 
        <th>Date</th> 
        <th>Status</th> 
       </tr> 
      </thead> 
      <tbody> 
       @for (int i = 0; i < Model.OrdersInProgress.Count(); i++) 
       { 
        <tr> 
         <td> 
          <a href="@Url.Action("OrderDetails", "Home", new { id = Model.OrdersInProgress[i].OrderId })">@Model.OrdersInProgress[i].OrderId</a> 
          @Html.HiddenFor(x => x.Model.OrdersInProgress[i].OrderId) 
         </td> 
         <td> 
          £@Model.OrdersInProgress[i].Total 
          @Html.HiddenFor(x => x.Model.OrdersInProgress[i].Total) 
         </td> 
         <td> 
          @Model.OrdersInProgress[i].OrderDate 
          @Html.HiddenFor(x => x.Model.OrdersInProgress[i].OrderDate) 
         </td> 
         <td> 
          @Html.DropDownListFor(m => Model.OrdersInProgress[i].Status, new SelectList(Model.OrderStatuses, "Id", "StatusName")) 
         </td> 
        </tr> 
       } 
      </tbody> 
     </table> 

     <h1>Orders Despatched</h1> 
     <table class="panel panel-default table cart-table"> 
      <thead> 
       <tr> 
        <th>Order ID</th> 
        <th>Total</th> 
        <th>Date</th> 
        <th>Status</th> 
       </tr> 
      </thead> 
      <tbody> 
       @for (int i = 0; i < Model.OrdersDespatched.Count(); i++) 
       { 
        <tr> 
         <td> 
          <a href="@Url.Action("OrderDetails", "Home", new { id = Model.OrdersDespatched[i].OrderId })">@Model.OrdersDespatched[i].OrderId</a> 
          @Html.HiddenFor(x => x.Model.OrdersDespatched[i].OrderId) 
         </td> 
         <td> 
          £@Model.OrdersDespatched[i].Total 
          @Html.HiddenFor(x => x.Model.OrdersDespatched[i].Total) 
         </td> 
         <td> 
          @Model.OrdersDespatched[i].OrderDate 
          @Html.HiddenFor(x => x.Model.OrdersDespatched[i].OrderDate) 
         </td> 
         <td> 
          @Html.DropDownListFor(m => Model.OrdersDespatched[i].Status, new SelectList(Model.OrderStatuses, "Id", "StatusName")) 
         </td> 
        </tr> 
       } 
      </tbody> 
     </table> 

     <div class="panel-body form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Update" class="btn btn-success" /> 
      </div> 
     </div> 
    } 
</div> 

コントローラメソッドは次のようになります:

あなた Statusモデルがsomethigであると仮定すると、
[HttpPost] 
public async Task<ActionResult> AdminOrders(AdminOrdersViewModel model) 
{ 
    // do stuff 
} 

あなたのビューは、今のようになります

public class AdminOrdersViewModel 
{ 
    public List<Order> OrdersInProgress { get; set; } 
    public List<Order> OrdersDespatched { get; set; } 
    public List<Status> OrderStatuses { get; set; } 
} 

like:

public class Status 
{ 
    public int Id { get; set; } 
    public string StatusName { get; set; } 
} 

あなたは上記のリストからドロップダウンリストを作成することができます。

@Html.DropDownListFor(m => Model.OrdersDespatched[i].Status, new SelectList(Model.OrderStatuses, "Id", "StatusName")) 

PS:また、あなたは、Getメソッドでステータスのリストを割り当てることを確認してください。

+0

ドロップダウンリストを作成する必要はありません。ビューモデルを更新するためのポストリクエストが成功する必要があります。 – naz786

+0

上記のコードは、更新されたステータスのリストを投稿します。 –

+1

MVCがデータベースとビューを同時に更新することができないため、私の同僚から、この行に沿った何かが可能ではないとわかったことが分かりました。これは私が実装しようとするAjaxを通して行われなければならず、完了したら回答を返信します。応答のためのクリスチャンありがとう、私は非常にあなたのドロップダウンリストを作成した便利な方法を発見した。 :D – naz786

関連する問題