2016-04-14 40 views
2

Bunun üzerinde çalışıyorum ve saatlerce araştırıyorum ve yine de bir çözüm bulamıyorum.C# - MVC 4 Çoktan İtibarlı Onay Kutuları değerleri başka bir görünüme geçti

İşaretli onay kutularının ItemNames öğelerini AsoociateMenuItems görünümümden İndeks görünümüme göstermeye çalışıyorum. Alabileceğim herhangi bir yardım için minnettar olurum.

MenuItemViewModel:

public class MenuItemViewModel 
{ 
    public int MenuId { get; set; } 
    public double ItemPrice { get; set; } 
    public string ItemName { get; set; } 
    public bool Selected { get; set; } 
    public virtual ICollection<IngredientViewModel> Ingredients { get; set;} 
} 

OrderViewModel:

public class OrderViewModel 
{ 
    public int OrderId { get; set; } 
    public int TableNum { get; set; } 
    public string Notes { get; set; } 
    public double Discount { get; set; } 
    public virtual ICollection<MenuItemViewModel> MenuItem { get; set; } 
} 

Endeksi:

@model IEnumerable<Final_POS.Models.Order> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Employee.EmpName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.TableNum) 
     </th> 
     <th> 
+ 
      @Html.DisplayNameFor(model => model.Discount) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.MenuItems) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Employee.EmpName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.TableNum) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Discount) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.MenuItems) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "AsoociateMenuItems", new { id=item.OrderId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.OrderId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.OrderId }) 
     </td> 
    </tr> 
} 

</table> 

AsoociateMenuItems: -bu benim düzenleme görünümünde yerine geçer

@model Final_POS.Models.ViewModel.OrderViewModel 


@{ 
    ViewBag.Title = "AsoociateMenuItems"; 
} 

<h2>AsoociateMenuItems</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>OrderViewModel</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.OrderId, new { htmlAttributes = new { @class = "form-control" } }) 

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

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

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

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

     @Html.EditorFor(model => model.MenuItem) 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Bu, sonraki kod parçacığı bu hat @ Html.EditorFor benim AsoociateMenuItems tarafından kullanılıyor (model => model.MenuItem)

MenuItemViewModel: (Görünüm)

@model Final_POS.Models.ViewModel.MenuItemViewModel 

<fieldset> 
    @Html.HiddenFor(model => model.MenuId) 

    @Html.CheckBoxFor(model => model.Selected) 
    @Html.DisplayFor(model => model.ItemName) 
    @Html.DisplayFor(model => model.ItemPrice) 

</fieldset> 

Denetleyici:

public class OrdersController : Controller 
    { 
     private POSContext db = new POSContext(); 

     // GET: Orders 
     public ActionResult Index() 
     { 
      var orders = db.Orders.Include(o => o.Employee); 
      return View(orders.ToList()); 
     } 

     // GET: Orders/Details/5 
     public ActionResult Details(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Order order = db.Orders.Find(id); 
      if (order == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(order); 
     } 

     // GET: Orders/Create 
     public ActionResult Create() 
     { 
      ViewBag.EmployeeEmpId = new SelectList(db.Employees, "EmpId", "EmpName"); 
      return View(); 
     } 

     // POST: Orders/Create 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "OrderId,TableNum,Discount,EmployeeEmpId")] Order order) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Orders.Add(order); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      ViewBag.EmployeeEmpId = new SelectList(db.Employees, "EmpId", "EmpName", order.EmployeeEmpId); 
      return View(order); 
     } 

     // GET: Orders/Edit/5 
     public ActionResult Edit(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Order order = db.Orders.Find(id); 
      if (order == null) 
      { 
       return HttpNotFound(); 
      } 
      ViewBag.EmployeeEmpId = new SelectList(db.Employees, "EmpId", "EmpName", order.EmployeeEmpId); 
      return View(order); 
     } 

     // POST: Orders/Edit/5 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit([Bind(Include = "OrderId,TableNum,Discount,EmployeeEmpId")] Order order) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(order).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      ViewBag.EmployeeEmpId = new SelectList(db.Employees, "EmpId", "EmpName", order.EmployeeEmpId); 
      return View(order); 
     } 

     // GET: Orders/Delete/5 
     public ActionResult Delete(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Order order = db.Orders.Find(id); 
      if (order == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(order); 
     } 

     // POST: Orders/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(int id) 
     { 
      Order order = db.Orders.Find(id); 
      db.Orders.Remove(order); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     public ActionResult AsoociateMenuItems(int? id) 
     { 
      Order _order = db.Orders.Find(id); 

      if (_order == null) 
      { 
       return HttpNotFound(); 
      } 

      OrderViewModel _orderViewModel = new OrderViewModel() 
      { 
       OrderId = _order.OrderId, 
       Discount = _order.Discount, 
       TableNum = _order.TableNum, 
       EmployeeEmpId = _order.EmployeeEmpId 
      }; 

      List<MenuItemViewModel> _menuItemViewModel = new List<MenuItemViewModel>(); 
      foreach (MenuItem menuItem in db.MenuItems) 
      { 
       _menuItemViewModel.Add(new MenuItemViewModel() 
       { 
        MenuId = menuItem.MenuId, 
        ItemName = menuItem.ItemName, 
        ItemPrice = menuItem.ItemPrice, 
        Selected = _order.MenuItems.Contains(menuItem) 
       }); 
      } 

      _orderViewModel.MenuItem = _menuItemViewModel; 

      return View(_orderViewModel); 
     } 



     [HttpPost] 
     public ActionResult AsoociateMenuItems(OrderViewModel _orderViewModel) 
     { 
      Order _order = db.Orders.Find(_orderViewModel.OrderId); 
      _order.MenuItems.Clear(); 

      foreach (MenuItemViewModel _menuItemViewModel in _orderViewModel.MenuItem) 
      { 
       if (_menuItemViewModel.Selected) 
       { 
        MenuItem _menuItem = db.MenuItems.Find(_menuItemViewModel.MenuId); 
        _order.MenuItems.Add(_menuItem); 
       } 
      } 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       db.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 
    } 
} 
+0

Üzgünüz, ama bir şey anlamak gerçekten zor. İlk soru, "Ben denetlenmiş onay kutusu değerleri benim view2 benim view1 için geçirmeye çalışıyorum." 'Değerler' yazdı ama View2'de sadece bir onay kutusu buldum - '@ Html.EditorFor (model => model.MenuItem) '. View1'den View2'ye demek istediğiniz bir şans var mıydı? – user2216

+0

Ayrıca, denetleyicinin (veya denetleyicilerin) tüm kodlarının adlarını ve ayrıca belirli Görünüm Adlarını da sağlayabilirsiniz. Kolay bir soru gibi görünüyor ama bu kod parçalarından bir şey anlayamıyorum. – user2216

+0

@ user2216 Benim AsoociateMenuItems View'umdan. MenuItemViewModel onay kutularının listesini görüntülemek için EditorTemplate içinde bulunan MenuItemViewModel kullanır. Bu satır, onay kutularının listesinin görüntülendiği yerdir. @ Html.EditorFor (model => model.MenuItem) '. İndeks görünümümde görüntülenecekleri kontrol edilen kutulardan ItemName'i almak istiyorum. Tüm orderController'mı görüntüledim ve her şeyi doğru adına yeniden adlandırdım. Eğer MenuItemsController'ime ihtiyacınız varsa, bunu yayınlayabilirim, ancak varsayılan üretimden hiçbir şey değişmedi. –

cevap

0

Başlayalım. Sorunuz anlamak gerçekten zor. AMA umarım anladım. İlk başta, tüm görünümlerde model kullanmalısınız. Bu gerçekten önemli. Yapmalısın. En kolay yolu - denetleyici yöntemini Index değiştirmek (Sadece ayrıca db menuitems olsun) Daha

// GET: Orders 
    public ActionResult Index() 
    { 
     var orders = db.Orders.Include(o => o.Employee).Include(o => o.MenuItems); 
     var orderModels = new List<OrderViewModel>(); 
     foreach(var _order in orders) 
     { 
      OrderViewModel _orderViewModel = new OrderViewModel() 
      { 
       OrderId = _order.OrderId, 
       Discount = _order.Discount, 
       TableNum = _order.TableNum, 
       EmpName = _order.Employee.EmpName 
      }; 

      List<MenuItemViewModel> _menuItemViewModels = new List<MenuItemViewModel>(); 
      foreach (MenuItem menuItem in order.MenuItems) 
      { 
       if(_order.MenuItems.Contains(menuItem)) //where selected is true 
       { 
        _menuItemViewModel.Add(new MenuItemViewModel() 
        { 
         MenuId = menuItem.MenuId, 
         ItemName = menuItem.ItemName, 
         ItemPrice = menuItem.ItemPrice, 
        }); 
       } 
      } 
      _orderViewModel.MenuItems = _menuItemViewModels; 
      orderModels.Add(_orderViewModel); 
     } 
     return View(orderModels); 
    } 

sizin Index Görünüm

@model IEnumerable<OrderViewModel> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.EmpName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.TableNum) 
     </th> 
     <th> 

      @Html.DisplayNameFor(model => model.Discount) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.MenuItems) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.EmpName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.TableNum) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Discount) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.MenuItems) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "AsoociateMenuItems", new { id=item.OrderId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.OrderId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.OrderId }) 
     </td> 
    </tr> 
} 

</table> 

değiştirmek daha sadece EmpName

public class OrderViewModel 
{ 
    public int OrderId { get; set; } 
    public int TableNum { get; set; } 
    public string Notes { get; set; } 
    public double Discount { get; set; } 
    public string EmpName { get; set; } 
    public virtual ICollection<MenuItemViewModel> MenuItems { get; set; } //renamed to plural 
} 

ile OrderViewModel uzatmak Umarım ne demek istediğimi anlarsın. Ve tabi ki, kodumun kodun yeniden kodlanması gerekiyor, ancak bunu kendiniz yapabilirsiniz.

+0

Çok teşekkür ederim! Neredeyse 6 saat çalıştı. Bu kusursuz çalıştı. –