2015-08-28 58 views
-2

我想使用viewmodel編寫編輯代碼,但我完全不解。如何使用viewmodel編輯mvc列表

這裏是我的視圖模型

public SearchCustomersCriteria SearchCustomersCriteria { get; set; } 
    public SearchCustomersResults SearchCustomersResults { get; set; } 

    public SearchProductsCriteria SearchProductsCriteria { get; set; } 
    public SearchProductsResults SearchProductsResults { get; set; } 

    public List<SelectedProduct> ListOfSelectedProducts { get; set; } 

    public int OrderId { get; set; } 
    public decimal Deposit { get; set; } 
    public DateTime DeliveryDate { get; set; } 
    //public string Status { get; set; } 
    public System.DateTime CreatedOn { get; set; } 

    //public SelectedProduct SelectedProduct { get; set; } 
    public BentleyBeds.InternalManagement.Web.Utility.Helper.OrderStatus Status { get; set; } 

} 
#endregion 

#region Selected products 
public class SelectedProduct 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
    public decimal UnitPrice { get; set; } 
    public int Quantity { get; set; } 
    public string Description { get; set; } 
    public bool Deleted { get; set; } 
} 
#endregion 

#region Customer search 

public class SearchCustomersCriteria 
{ 
    public string FristName { get; set; } 
    public string LastName { get; set; } 
} 
public class SearchCustomersResults 
{ 
    public List<Data.Customer> ListOfCustomers { get; set; } 
    public int SelectedCustomerId { get; set; } 
} 

#endregion 

#region Products 
public class SearchProductsCriteria 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
} 

public class SearchProductsResults 
{ 
    public List<Data.Product> ListOfProducts { get; set; } 
    public int SelectedProductId { get; set; } 
} 

} 

這是控制器

public ActionResult Create() 
    { 
     var model = new CreateOrderViewModel(); 
     //model.ListOfSelectedProducts = new List<SelectedProduct>(){ 
     // new SelectedProduct(){Description="ab", ProductName ="abc", Quantity=0, UnitPrice=0}}; 
     model.ListOfSelectedProducts = new List<SelectedProduct>(); 
     model.SearchCustomersCriteria = new SearchCustomersCriteria(); 
     model.SearchCustomersResults = new SearchCustomersResults(); 
     model.SearchProductsCriteria = new SearchProductsCriteria(); 
     model.SearchProductsResults = new SearchProductsResults(); 

     return View(model); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(CreateOrderViewModel model, List<string> ProductName, List<SetupProductViewModel> productViewModel, string FristName) 
    { 

     //if (ModelState.IsValid) 
     //{ 
      try 
      { 

       var status = model.Status.ToString(); 
       var deliver = model.DeliveryDate; 
       using (var ctx = new BentleyBedsEntities()) 
       { 
        //add into orders 
        var order = new Order() 
        { 
         CustomerId = model.SearchCustomersResults.SelectedCustomerId, 
         DeliveryDate = model.DeliveryDate, 
         Deposit = model.Deposit, 
         StatusId = helper.GetEnumKey(status), 
         CreatedOn = DateTime.Now 

        }; 
        ctx.Orders.Add(order); 
        //var result = ctx.SaveChanges(); 

        var id = order.OrderId; 
        if (ctx.Orders.Any(e => e.OrderId == id)) 
        { 
         ctx.Orders.Attach(order); 
         //tx.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified); 
        } 
        else 
        { 
         ctx.Orders.Add(order); 
        } 

        var result = ctx.SaveChanges(); 


        if (result > 0) 
        { 
         var orderId = order.OrderId; 
         foreach (SelectedProduct selectedProduct in model.ListOfSelectedProducts) 
         { 
          if (!selectedProduct.Deleted) 
          { 
           var orderDetails = new OrdersDetail() 
           { 
            OrderId = orderId, 
            ProductId = selectedProduct.ProductId, 
            Price = selectedProduct.UnitPrice, 
            Quantity = selectedProduct.Quantity, 
            Description = selectedProduct.Description 
           }; 
           ctx.OrdersDetails.Add(orderDetails); 
           var results = ctx.SaveChanges(); 
          } 


         } 

        } 
       } 
      } 
      catch (DbUpdateException ex) 
      { 
       UpdateException updateException = (UpdateException)ex.InnerException; 
       SqlException sqlException = (SqlException)updateException.InnerException; 

       foreach (SqlError error in sqlException.Errors) 
       { 
        // TODO: Do something with your errors 
        var result = error.Message; 
       } 
      } 
      catch (Exception ex) 
      { 
       var stat = ex.ToString(); 
       return View("Create", model); 
       //throw; 
      } 

      return RedirectToAction("Index"); 
     //} 
     //return View("Create", model); 

    } 

    // GET: /CreateOrder/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Order order = context.Orders.Find(id); 
     if (order == null) 
     { 
      return HttpNotFound(); 
     } 
     ViewBag.CustomerId = new SelectList(context.Customers, "Firstname", "Firstname", order.Customer.Firstname); 
     return View(order); 
    } 

    // POST: /CreateOrder/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,CustomerId,Customer,Firstname,Deposit,DeliveryDate,StatusId,CreatedBy,CreatedOn,CompanyID")] Order order) 
    { 
     if (ModelState.IsValid) 
     { 
      context.Entry(order).State = EntityState.Modified; 
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.CustomerId = new SelectList(context.Customers, "Firstname", "Firstname", order.Customer.Firstname); 
     return View(order); 
    } 

我應該怎麼寫編輯代碼在控制器和視圖?

+0

當前代碼有什麼問題? – Neel

+0

我想使用視圖模型編寫編輯代碼,使用模型綁定生成書面編輯代碼 –

+0

生成的代碼有什麼問題? –

回答

0

下面是如何創建使用視圖模型您編輯代碼的例子。首先,根據要編輯的模型中的特定項目創建ViewModel的類。

例如,假設你有一個Book類:

public class Book 
{ 
    public int BookID { get; set; } 
    public string Name { get; set; } 
    public int LibraryID { get; set; } 
} 

現在,你想有一個視圖模型,只修改這本書的名稱。然後,它應該是這樣的:

public class EditBookViewModel 
{ 
    public int BookID { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

在你的控制器,你就必須「找」返回的數據,方法和把數據傳回數據庫中的一個「後」的方法。它看起來像這樣:

public class YourController 
{ 
    ... 
    public ActionResult Edit(int id) 
    { 
     Book book = ctx.Books.Find(id); 
     var viewModel = new EditBookViewModel() 
     { 
     BookID = book.BookID, 
     Name = book.Name 
     } 
     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Edit(EditBookViewModel viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
     var model = ctx.Books.Find(model.BookID); 
     viewModel.Name = model.Name; 
     ctx.SaveChanges(); 
     } 
     return RedirectToAction("Index"); 
    } 
    ... 
} 

請確保您的視圖準備好接收EditBookViewModel。你可以通過在視圖頂部添加:

@model EditBookViewModel 
+0

謝謝我會嘗試 –

+0

感謝Mateus Rodrigues de Mor it works(y) –

+0

是的,沒問題! :) 如果您可以請將答案標記爲已接受,只需點擊答案 –