2009-04-14 25 views
7

Tôi đang cố gắng triển khai các phương thức Hành động chỉnh sửa của mình với chế độ xem được nhập mạnh sẽ nhận được lớp ViewModel tùy chỉnh. Nói cách khác, tôi muốn có một ViewModel được gõ mạnh mẽ có chứa thực thể LINQ cần được chỉnh sửa cộng với một vài đối tượng khác sẽ được hiển thị trong View.ViewModel được gõ mạnh mẽ trong phương thức POST hành động chỉ chứa các giá trị rỗng

Tôi có thể nhìn thấy khung nhìn khi gọi phương thức GET Edit, nhưng phương thức POST được gõ mạnh chỉ nhận một lớp ViewModel với các tham số null và tôi không thể tìm ra cách lấy các tham số POST.

The View mẫu trông như sau:

//my custom-shaped ViewModel 
public class CustomersFormViewModel 
{ 
    public SelectList AccountTypesDropDownBox; 
    public SelectList CountriesDropDownBox; 
    public Customer Customer; 
} 

Phương pháp hành động trông như sau:

// 
// GET: /CustomersController/Edit 

public ActionResult Edit(int ID) 
{ 
    var model = new CustomersFormViewModel 
        { 
         Customer = repository.Load(ID.Value), 
         CountriesDropDownBox = GetCountries(), 
         AccountTypesDropDownBox = GetAccountTypes() 
        }; 
    return View(model); 
} 

// 
// POST: /CustomersController/Edit 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(CustomersFormViewModel model) 
{ 
    //THE NEXT LINE THROWS!!! 
    Debug.Assert(Model.Customer!=null); 
    return View(model); 
} 

Và đây là quan điểm của tôi Chỉnh sửa:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/CustAdminMaster.master" 
    Inherits="System.Web.Mvc.ViewPage<Zeiterfassung.Controllers.CustomersController+CustomersFormViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    NewEdit 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
     NewEdit</h2> 
    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 
    <% using (Html.BeginForm()) 
     {%> 
    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      <label for="FirstName">FirstName:</label> 
      <%= Html.TextBox("FirstName",Model.Customer.FirstName) %> 
      <%= Html.ValidationMessage("FirstName", "*") %> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
    <% } %> 
    <div> 
     <%=Html.ActionLink("Back to List", "Index") %> 
    </div> 
</asp:Content> 

Tôi cũng đã đã thử phương thức POST với các tham số formValues, nhưng mô hình khung nhìn vẫn không chứa tham số được đăng:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int ID, FormCollection formValues) 
{ 
     CustomersFormViewModel model = new CustomersFormViewModel();    
     UpdateModel(model); 
     //THE NEXT LINE STILL THROWS 
     Debug.Assert(model.Customer!=null); 
     return View("NewEdit",model); 
} 

Cách duy nhất tôi đã tìm thấy cho đến nay là viết mã của riêng mình lấy thông số đã đăng từ FormCollection và cập nhật ViewModel tùy chỉnh của tôi cho phù hợp. Nhưng cách tiếp cận này có vẻ hơi thô sơ. Có thực sự không có cách nào tốt hơn để làm điều này?

EDIT: Tôi vừa thử một cú pháp khác nhau trong giao diện như tvanfosson gợi ý, nhưng vấn đề vẫn không thay đổi:

<label for="Customer.FirstName">FirstName:</label> 
    <%= Html.TextBox("Customer.FirstName") %> 
    <%= Html.ValidationMessage("Customer.FirstName", "*") %> 

Trả lời

7

Bạn cần phải đặt tên cho các lĩnh vực của bạn phù hợp với các tiền tố trong mô hình . Ngoài ra, bạn sẽ cần sửa đổi mô hình xem của mình để sử dụng các thuộc tính thay vì các trường. Trình kết nối mô hình mặc định chỉ xem xét các thuộc tính công khai trên mô hình khi ràng buộc.

<label for="Customer.FirstName">FirstName:</label> 
    <%= Html.TextBox("Customer.FirstName") %> 
    <%= Html.ValidationMessage("Customer.FirstName", "*") %> 

Bằng cách đó, trình kết nối mô hình biết cách liên kết thông số biểu mẫu với thành phần thích hợp và thuộc tính liên quan của mô hình của bạn.

+0

Cảm ơn trả lời của bạn! "Customer.FirstName" không hoạt động, vì Khách hàng là một phần của mô hình của tôi, nhưng không phải là mô hình. Tôi giả sử bạn có nghĩa là Model.Customer.FirstName và tôi đã thử điều này (xem tôi thấy bài viết của tôi chỉnh sửa), nhưng vấn đề vẫn không thay đổi. –

+0

Khách hàng là tài sản của mô hình của bạn để sử dụng "Customer.FirstName" là phù hợp. Nó sẽ sử dụng sự phản chiếu để tìm ra thuộc tính "Customer" trên Model của bạn, sau đó là thuộc tính "FirstName" trên nó. Bạn cũng không cần phải cung cấp giá trị nó sẽ được lấy ra từ mô hình nếu thuộc tính phù hợp được tìm thấy – tvanfosson

+0

Tôi vừa dán các dòng chính xác từ bài đăng của bạn vào chế độ xem của tôi. Vấn đề vẫn không thay đổi. Ngoài ra, tôi đã thử đặt FirstName thành "test" trong phương thức GET action. Trường nhập liệu trống khi nhìn vào khung nhìn trong trình duyệt, vì vậy có điều gì đó sai với cú pháp bạn đã đề xuất –

0

Hãy thử

UpdateModel(model, "Customer"); 

Và cũng hãy xem ở đây:

UpdateModel prefix - ASP.NET MVC

Nếu nó vẫn không hoạt động, thiết lập một breakpoint ở sau UpdateModel. Nếu nó không làm công việc, hãy thử trong quickWatch (ctrl + alt + q) với các kết hợp khác nhau gọi UpdateModel.

Nếu số vẫn còn không hoạt động, hãy kết nối nguồn và gỡ lỗi một chút :). Bạn sẽ học một cái gì đó mới và sau đó bạn sẽ cho chúng tôi biết về nó :). Sau đó mọi người đều hạnh phúc.

Chúc may mắn.

6

Đã lâu rồi nhưng thực sự chưa có câu trả lời cho câu hỏi này.

Đã bị xáo trộn với cùng một vấn đề cho đến khi tôi bắt được thuộc tính tự động trên chế độ xem của tôi có bộ riêng tư.

Nhìn vào chế độ xem của bạn, bạn thiếu các thuộc tính tự động nhận và đặt tất cả cùng nhau!

Vì vậy, thay đổi viewmodel bạn cho phù hợp:

public class CustomersFormViewModel 

    { 
     public SelectList AccountTypesDropDownBox {get; set;} 
     public SelectList CountriesDropDownBox {get; set;} 
     public Customer Customer {get; set;} 
    } 
+0

Bạn đúng, tuy nhiên, tvanfosson đã được khoảng 8 tháng trước đó ;-) –

+2

Tình cờ về điều này là tốt, mặc dù tôi không thấy nơi tvanfosson đề nghị kiểm tra cho setters tư nhân. Dù sao, chuyển từ thiết lập riêng tư sang thiết lập đã hoạt động. Cảm ơn Ithai. – trevorc

Các vấn đề liên quan