2011-01-28 18 views
15

Điều này có lẽ rất đơn giản nhưng tôi không thể dường như sắp xếp nó ra trên của riêng tôi. tôi đã tạo ra một đơn giản db và tổ chức phương thức trông như thế nàydropdown trong mvc3 chỉnh sửa mẫu

enter image description here

Tôi cố gắng để tạo ra một Tạo hình thức cho phép tôi để thêm một thứ tự mới. Tôi có tổng cộng 3 bảng vì vậy những gì tôi đang cố gắng có biểu mẫu cho phép người đó nhập Ngày đặt hàng và cũng có danh sách thả xuống cho phép tôi chọn sản phẩm từ bảng sản phẩm

Tôi muốn trở thành có thể tạo chế độ xem Thêm hoặc Chỉnh sửa cho phép tôi chèn OrderDate vào OrderTable và cũng chèn OrderID và ProductID đã chọn vào OrderProduct.

Tôi cần thực hiện các bước nào ở đây.

Tôi đã tạo ra một OrderController và đánh dấu vào "Add Hành động" và hơn thêm một Tạo Xem mà trông như thế này

@model Test.OrderProduct 

@{ 
    ViewBag.Title = "Create2"; 
} 

    <h2>Create2</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>OrderProduct</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.OrderID) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.OrderID) 
      @Html.ValidationMessageFor(model => model.OrderID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProductID) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProductID) 
      @Html.ValidationMessageFor(model => model.ProductID) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

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

Điều này tạo ra quan điểm cho rằng có chứa một textbox cho cả OrderID và ProductID tuy nhiên không có ngày.

khiển CreatePost My has not được thay đổi

[HttpPost] 
    public ActionResult Create(FormCollection collection) 
    { 
     try 
     { 
      var data = collection; 
      // TODO: Add insert logic here 
      // db.Orders.AddObject(collection); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Câu hỏi của tôi là,

1.How để tôi trao đổi trên ProductID textbox là một thả xuống đó được phổ biến từ sản phẩm 2.How làm tôi nhận được dữ liệu từ bộ sưu tập FormCollection? Tuy nhiên, tôi đã nghĩ đến việc chỉ là một foreach nhưng tôi không biết làm cách nào để có được tên được đánh máy mạnh mẽ

Bất kỳ trợ giúp nào cho người mới đều rất hữu ích.

Cảm ơn bạn!

+0

Thật buồn cười rằng đây là câu hỏi chính xác hiện tại của tôi, nhưng chưa ai trả lời câu hỏi ở đây. Tôi đã nghĩ rằng những người nghiện MVC sẽ nhảy lên trong 2 giây bằng phẳng. –

Trả lời

25

Điều đầu tiên trước tiên, không liên kết với đơn hàng Đơn hàng. Không bao giờ liên kết với đối tượng EF, luôn thử và sử dụng ViewModel. Làm cho cuộc sống trở nên đơn giản hơn cho Chế độ xem và đó là mục tiêu ở đây.

Vì vậy, có một ViewModel như thế này:

public class CreateOrderViewModel 
{ 
    public int OrderId { get; set; } 
    public DateTime OrderDate { get; set; } 
    public int SelectedProductId { get; set; } 
    public IEnumerable<SelectListItem> Products { get; set; } 
} 

Vậy đó ngay bây giờ.

Return đó để Xem của bạn trong hành động [HttpGet] điều khiển:

[HttpGet] 
public ActionResult Create() 
{ 
    var model = new CreateOrderViewModel 
    { 
     Products = db.Products 
        .ToList() // this will fire a query, basically SELECT * FROM Products 
        .Select(x => new SelectListItem 
        { 
         Text = x.ProductName, 
         Value = x.ProductId 
        }); 
    }; 

    return View(model); 
} 

Sau đó, để render ra danh sách các sản phẩm: (HTML cơ bản loại trừ)

@model WebApplication.Models.CreateOrderViewModel 

@Html.DropDownListFor(model => model.SelectedProductId, Model.Products) 

Điều duy nhất tôi không biết cách làm là liên kết với trường DateTime. Tôi đoán bạn sẽ cần một phương thức mở rộng (Trình trợ giúp HTML) để hiển thị Bộ chọn ngày hoặc một cái gì đó. Đối với Chế độ xem này (tạo đơn đặt hàng mới), chỉ cần đặt mặc định là DateTime.Now.

Bây giờ, vào hành động [HttpPost] điều khiển:

[HttpPost] 
public ActionResult Create(CreateOrderViewModel model) 
{ 
    try 
    { 
     // TODO: this manual stitching should be replaced with AutoMapper 
     var newOrder = new Order 
     { 
     OrderDate = DateTime.Now, 
     OrderProduct = new OrderProduct 
     { 
      ProductId = SelectedProductId 
     } 
     }; 

     db.Orders.AddObject(newOrder); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 

Bây giờ, tôi cũng nghĩ rằng mô hình EF của bạn cần làm việc.

Với tôi (bằng tiếng Anh), một Sản phẩm có thể có nhiều đơn đặt hàng và Đơn đặt hàng có thể có nhiều Sản phẩm.

Vì vậy, nó phải là rất nhiều. Hiện tại nó là một 1-1 với một bảng nối dự phòng. Bạn đã tạo ra nó từ một DB? Nếu vậy, DB của bạn có thể cần làm việc.

Bạn nên có một tài sản hàng hải gọi Sản phẩm trên tự tổ chức nào, mà tham chiếu đến một bộ sưu tập các sản phẩm , có thể thực hiện bởi một im lặng tham gia vào bảng tham gia vào nhiều-nhiều.

Điều này cũng có nghĩa là bạn không còn có DropDownList nữa, nhưng một MultiSelectDropDownList.

+0

trong phương thức '[HttpGet]' ở trên, tôi tiếp tục nhận được một lỗi nói với tôi rằng tôi không thể chuyển đổi int thành chuỗi cho chuỗi 'value = x.id'! Tôi đã thêm một 'ToString()' nhưng sau đó tôi nhận được lỗi này: Lỗi Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.IEnumerable ' thành 'System.Collections.Generic.IEnumerable '. Một chuyển đổi rõ ràng tồn tại (bạn có bỏ lỡ một dàn diễn viên không?) – Ben

+0

@Ben - rất có thể bạn thiếu tham chiếu sử dụng – RPM1984

+0

@ RPM1984 Bạn có thể giải thích tại sao không ràng buộc trực tiếp với EF không? Lý do là gì? Nếu nhìn vào nó có vẻ đơn giản hơn, chú thích được tôn trọng và tất cả. – Anderson

1

Tôi cũng đang vật lộn với điều này trong một ngày qua. Tôi sẽ chia sẻ kiến ​​thức hạn chế của mình với hy vọng rằng nó sẽ giúp người khác.

Lưu ý rằng tôi sử dụng một singleton có danh sách được điền trước để giữ đơn đăng ký mẫu nhỏ của tôi (ví dụ: không có tương tác EF hoặc DB).

Để hiển thị ProductList, bạn sẽ cần có mục ViewBag hoặc ViewData chứa Danh sách sản phẩm. Bạn có thể thiết lập này trong điều khiển với một cái gì đó giống như

ViewData["ProductList"] = new SelectList(Models.MVCProduct.Instance.ProductList, "Id", "Name", 1); 

Sau đó cập nhật Xem của bạn để một cái gì đó như:

<div class="editor-field">@Html.DropDownList("ProductList")</div> 

Đối với bài viết/Tạo/Cập nhật bước bạn cần phải nhìn vào FormCollection để nhận kết quả của bạn. Đọc các bài đăng khác có vẻ như đã từng có lỗi ở đây nhưng đã được khắc phục ngay bây giờ để đảm bảo bạn có bản mới nhất. Đối với ví dụ của tôi, tôi có một DropDownList cho sản phẩm vì vậy tôi chỉ nhận được Id đã chọn và sau đó đi tìm kiếm Sản phẩm đó trong danh sách của tôi.

[HttpPost] 
    public ActionResult Create(FormCollection form)//Models.MVCOrder newOrder) 
    { 

     MVC.Models.MVCOrder ord = Models.MVCOrder.Instance.CreateBlankOrder(); 
     //Update order with simple types (e.g. Quantity) 
     if (TryUpdateModel<MVC.Models.MVCOrder>(ord, form.ToValueProvider())) 
     { 
      ord.Product = Models.MVCProduct.Instance.ProductList.Find(p => p.Id == int.Parse(form.GetValue("ProductList").AttemptedValue)); 
      ord.Attribute = Models.MVCAttribute.Instance.AttributeList.Find(a => a.Id == int.Parse(form.GetValue("attributeId").AttemptedValue)); 
      UpdateModel(ord); 
      return RedirectToAction("Index"); 
     } 
     else 
     { 
      return View(ord); 
     } 
    } 

Tôi chỉ đang làm việc trên MVC3 trong vài ngày qua, vì vậy, bất kỳ lời khuyên nào về cải thiện ở trên đều sẽ được đánh giá cao.

2

Cảm ơn Craig. Vài ngày của bạn (như tại thời điểm đăng bài) của MVC đã giải quyết vài ngày của tôi cố gắng để có được giá trị được lựa chọn trở lại từ DropDownListFor.

Tôi không gặp vấn đề gì trong chế độ xem Tạo trong giá trị được chọn của DDLF, nhưng chế độ xem Chỉnh sửa là một vấn đề hoàn toàn khác - không có gì tôi đã thử sẽ lấy lại giá trị đã chọn trong Bài đăng. Tôi nhận thấy giá trị được chọn đã ẩn trong TryedValue của ModelState và vì vậy Dr.Google đã giới thiệu tôi ở đây.

Tôi có điều này theo quan điểm của tôi

@Html.DropDownList(model => model.ContentKeyID, Model.ContentKeys, Model.ContentKeyName) 

nơi ContentKeys là một SelectList dân cư từ DB thông qua một ViewModel, và ContentKeyName là tên được lựa chọn curently.

Điều kỳ lạ là, tôi có một DDL khác trên lượt xem được điền theo cách giống hệt nhau. Cái này hoạt động. Tại sao, tôi không biết. Đây là DDL thứ hai trên biểu mẫu, nhưng tôi không thể thấy điều đó tạo nên sự khác biệt.

Tôi đọc ở một nơi khác có thể là tôi đã sử dụng Guids làm Id, nhưng điều đó dường như không tạo nên sự khác biệt - tôi đổi thành Int32, nhưng không nghĩ mình phải - Tôi nghĩ đó là enums không đồng ý với DDLF. Nullables dường như không tạo nên sự khác biệt nào.

Bây giờ tôi đã thêm bộ sưu tập mẫu cho bài viết ActionResult của tôi, và có được giá trị được lựa chọn sử dụng

-Xem

@Html.DropDownList("ContentKey", Model.ContentKeys) 

khiển -in (bài viết)

contentKeyId = int.Parse(form.GetValue("ContentKey").AttemptedValue); 

tất cả đều tốt, và tôi có thể tiếp tục với những điều thú vị hơn. Tại sao những thứ đơn giản nhất có thể giữ bạn lâu đến vậy?