Hãy phá vỡ này xuống bằng cách kiểm tra chữ ký phương pháp:
MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
này được sử dụng cú pháp phương pháp khuyến nông, có nghĩa là nó thêm một phương thức có tên EditorFor
để HtmlHelper
như vậy mà bạn có thể thực hiện cuộc gọi Html.EditorFor
. Nhưng những gì chúng tôi thực sự quan tâm là tham số thứ hai, Expression<Func<TModel, TValue>>
. Đó là một thông số khá phức tạp, nhưng hiện tại chúng tôi có thể bỏ qua thực tế rằng đó là một số Expression
. Vì vậy, đơn giản hóa, chúng ta hãy xem xét:
Func<TModel, TValue> expression
Điều này có nghĩa rằng các đối số là bất kỳ phương pháp có một tham số (loại TModel
) và kiểu trả về là TValue
. Bạn đã sử dụng lambdas, đó là (cơ bản) là một biểu diễn ngắn gọn hơn về một phương pháp, nhưng nó chỉ hữu ích khi nghĩ về nó như một phương pháp thông thường. Vì vậy, bạn lambda đang thực hiện một mô hình và trả về một mô hình:
m => m
Đó không phải là thú vị, vì vậy chúng ta hãy so sánh nó với một kịch bản thực tế hơn nơi bạn đang trở về một tài sản ra khỏi mô hình:
m => m.MyStringProperty
Bây giờ chúng ta hãy so sánh nó với một phương pháp tĩnh bình thường bạn đã tuyên bố ở đâu đó:
public static class MyStaticClass
{
public static string Foo(TModel model)
{
return model.MyStringProperty;
}
}
Mặc dù thực sự ở đây nó sẽ không được TModel
- nó sẽ được bất cứ điều gì bạn đã khai báo loại mô hình của bạn qua @model
. Bây giờ, vì lợi ích của thảo luận, bạn có thể thay vào đó sử dụng phương pháp này trong gọi lại EditorFor
:
Html.EditorFor(MyStaticClass.Foo);
Vì vậy, để tổng hợp, lambdas là (đối với hầu hết các phần) chỉ là một tay ngắn cho một phương pháp thông thường. Vì vậy, tất cả các bạn đang làm là đi qua các phương pháp xung quanh.Lưu ý cuối cùng ở đây là chúng tôi đang thực sự sử dụng cây biểu thức, có nghĩa là bạn không thực sự chuyển phương thức, bạn đang truyền một mô hình đối tượng (một cây biểu thức) đại diện cho mã của phương thức. Điều này, về cơ bản, chỉ được sử dụng để tìm ra tên thuộc tính bạn đang sử dụng (vì thường là lambda sẽ giống như m => m.MyProperty
, không chỉ đơn thuần là m => m
). Đây là tất cả để tránh các chuỗi ma thuật mà bạn tham chiếu đến tên thuộc tính bằng cách sử dụng một chuỗi (tức là "MyProperty").
"và không thấy bất kỳ sự quá tải nào để truyền trong chỉ một tham số" - 'EditorFor' là một phương thức mở rộng, vì vậy bạn đang tìm kiếm quá tải với hai tham số, đầu tiên là" this ". – hvd
Ngoài ra một điều mà tôi muốn khuyên bạn nên xây dựng một trang web trong mvc3 là sử dụng các loại trình soạn thảo cụ thể như '@ Html.TextBoxFor (m => m.name)' này để nếu bạn muốn có một giá trị mặc định sẽ làm việc. Nơi tôi (ít nhất) đã không thể gán điều này cho một 'EditorFor'. Ngoài ra TextBox/TextArea vv hỗ trợ giữ chỗ trong số những thứ khác, nơi 'EditorFor' không. để bạn có thể làm '@ Html.TextBoxFor (m => m.Name, mới {placeholder =" John Doe "})' và mvc sẽ tự động triển khai trình giữ chỗ trong các trình duyệt hỗ trợ nó. – Jared