2008-12-07 24 views
10

Tôi đang gặp sự cố với TryUpdateModel(). Các trường biểu mẫu của tôi được đặt tên bằng tiền tố nhưng tôi đang sử dụng - làm dấu phân tách của tôi chứ không phải dấu chấm mặc định.UpdateModel prefix - ASP.NET MVC

<input type="text" id="Record-Title" name="Record-Title" /> 

Khi tôi cố gắng cập nhật mô hình, nó sẽ không được cập nhật. Nếu tôi thay đổi thuộc tính name thành Record.Title nó hoạt động hoàn hảo nhưng đó không phải là những gì tôi muốn làm.

bool success = TryUpdateModel(record, "Record"); 

Có thể sử dụng dấu phân tách tùy chỉnh không?

Trả lời

3

Không trừ khi bạn triển khai ModelBinder của riêng bạn. Nếu bạn nhìn vào mã nguồn cho DefaultModelBinder trên www.codeplex.com/aspnet, bạn sẽ thấy rằng khi bạn chỉ định tiền tố, nó sẽ tạo tên bằng cách ghép nối tiền tố, dấu chấm và tên của thuộc tính. Thật không may, phương thức trên DefaultModelBinder thực hiện điều này là private static và do đó không thể được ghi đè trong một lớp dẫn xuất.

10

Một điều cần lưu ý là tiền tố là để giúp phản ánh tìm (các) trường thích hợp để cập nhật. Ví dụ nếu tôi có một lớp tùy chỉnh cho ViewData của tôi như:

public class Customer 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

public class MyCustomViewData 
{ 
    public Customer Customer {get; set;} 
    public Address Address {get; set;} 
    public string Comment {get; set;} 
} 

và tôi có một textbox trên trang của mình

<%= Html.TextBox("FirstName", ViewData.Model.Customer.FirstName) %> 

hoặc

<%= Html.TextBox("Customer.FirstName", ViewData.Model.Customer.FirstName) %> 

đây là những gì làm việc

public ActionResult Save (Formcollection form) 
{ 
    MyCustomViewData model = GetModel(); // get our model data 

    TryUpdateModel(model, form); // works for name="Customer.FirstName" only 
    TryUpdateModel(model.Customer, form) // works for name="FirstName" only 
    TryUpdateModel(model.Customer, "Customer", form); // works for name="Customer.FirstName" only 
    TryUpdateModel(model, "Customer", form) // do not work 

    ..snip.. 
} 
+0

Bạn có thể chỉ đơn giản là ví dụ thứ hai: <% = Html.TextBox ("Customer.FirstName")%> –

-2

Có lý do không để sử dụng. như ID/Tên trong HTML bcs nó không phải là tiêu chuẩn. Ví dụ, sẽ phá vỡ nếu có một dấu chấm trong mục tiêu.

+0

Dấu gạch dưới được sử dụng cho các ID HTML/CSS. Dấu chấm chỉ được sử dụng cho các tên đầu vào của biểu mẫu. –

0

đó là quyết định xấu để sử dụng thời gian. Dấu gạch dưới sẽ tốt hơn.

Điều này có nghĩa là bạn phải xác định riêng tất cả các id của mình.

tức là. Giờ đây, hộp văn bản có Html.TextBox ("test.test", mới {@ id = "test")