2012-05-06 67 views
13

Tôi chỉ đang học C# và MVC, và cố gắng hiểu một số ví dụ.@ Html.EditorFor (m => m) cú pháp lambda trong MVC

@Html.EditorFor(m => m) 

Cuối cùng tôi đã tìm ra rằng '=>' là toán tử lambda và có nghĩa là "m như vậy". Điều đó không thực sự có ý nghĩa với tôi. Tại sao không chỉ vượt qua trong m?

Ngoài ra, tôi không thấy m được xác định trong bất kỳ chế độ xem nào mà tôi đang làm việc. Mô hình được xác định và được cho là đó là phương pháp mà phương thức này đang chọn. Nó hoạt động như thế nào?

Cuối cùng, tôi đã xem định nghĩa cho Html.EditorFor và không thấy bất kỳ sự quá tải nào để truyền trong chỉ một tham số. Cú pháp này được định nghĩa ở đâu? http://msdn.microsoft.com/en-us/library/ee834942.aspx

+2

"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

+2

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

Trả lời

18

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").

+1

wow, câu trả lời tuyệt vời! Phần tôi bị thiếu là bạn phải sử dụng một biểu thức là một tên phương thức trả về một mô hình. Ví dụ của bạn với MyStaticClass hữu ích nhất khi hiểu khái niệm đó. –

3
  1. Trong ví dụ của bạn, chức năng lambda không phục vụ mục đích nào, sự thật. Nhưng việc sử dụng thực sự của nó là khi bạn muốn kết xuất trình soạn thảo cho thuộc tính của mô hình: @ Html.EditorFor (m => m.SomeProperty). Các biểu thức lambda thực sự chỉ là viết tắt của các hàm, nhưng được gõ mạnh mẽ theo cách delegates. Khái niệm có thể quen thuộc hơn với Javascript:

    myFunction (hàm (x) {return x.SomeProperty;});

  2. Chữ "m" không được xác định trước. Nó đặt tên tham số cho phần thứ hai của biểu thức lambda, và có thể là bất cứ điều gì: @ Html.EditorFor (bất cứ điều gì => bất cứ điều gì). (Nó đề cập đến cùng một điều, trong trường hợp này là mô hình của trang, bất kể bạn đặt tên nó là gì.)

  3. Tham số đầu tiên bạn nhìn thấy trong các định nghĩa đó cho Html.EditorFor không thực sự là tham số. Bạn sẽ nhận thấy họ đang sử dụng từ khóa này để xác định extension methods. Tham số đó đề cập đến đối tượng đã gọi phương thức, trong trường hợp này là đối tượng HtmlHelper < Kiểu>.

+0

3. Rất hữu ích, tôi đã không nhận thấy/nhận ra nó đã đi qua "này" như tham số đầu tiên. 2. Tôi vẫn còn một chút hoang mang bởi chức năng lambda này, kể từ khi kết hợp với câu trả lời của Kirk Woll, nó phải trả về một kiểu mô hình –

1

suy nghĩ của các nhà điều hành => như có nghĩa là "đi vào", vì vậy (m => m) có nghĩa là "m đi m", một cách khác để nói rằng bạn lấy lại điều tương tự m.

Trong ví dụ của bạn, @Html.EditorFor(m => m), m là thông số nhập ẩn danh cho biểu thức lambda m => m, là đối số của phương thức tiện ích EditorFor. Như bạn đã lưu ý trong câu hỏi của mình, không có quá tải nào cho phương thức này mất ít hơn một tham số đơn; điều này là bởi vì nó là một Extension Method và tham số đầu tiên cho biết loại nó mở rộng. Tham số thứ hai là Expression và bạn có thể sử dụng biểu thức lambda cho các tham số này.

2

1.

  • @Html.EditorFor(m => m) - biên tập hiển thị cho toàn bộ mô hình
  • @Html.EditorFor(m => m.propertyName) - biên tập hiển thị cho bất động sản cụ thể của mô hình

2.

@Html.EditorFor(m => m) bằng @Html.EditorFor(t => t) hoặc @Html.EditorFor(randomName => randomName). Tên không quan trọng, nó chỉ là tên của tham số. Loại cho tham số này là loại mô hình xem.

Bạn phải chuyển hàm, bởi vì nó không chỉ là giá trị, mà đếm được. Các phản ánh được sử dụng để lấy các thuộc tính, mô tả cách hiển thị thuộc tính. Nhìn vào ví dụ này

public class ResetPasswordModel 
{ 
    public string Username { get; set; } 

    [DataType(DataType.Password)] 
    public string NewPassword { get; set; } 
    [DataType(DataType.Password)] 
    public string PasswordConfirmed { get; set; } 
} 

Thuộc tính mô tả, mà newpassword nên trường mật khẩu, không phải đầu vào thường xuyên. Nếu chúng ta thông qua giá trị, điều đó sẽ không thể.

Trong ví dụ của chúng tôi @Html.EditorFor(m => m) sẽ hiển thị để chứa một đầu vào cho tên người dùng và hai đầu vào mật khẩu cho mật khẩu. @Html.EditorFor(m => m.NewPassword) sẽ hiển thị đầu vào có loại mật khẩu.

3.

http://msdn.microsoft.com/en-us/library/ee402949.aspx

public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression 
) 

Đây là phương pháp mở rộng cho lớp HtmlHelper. this HtmlHelper<TModel> html không phải là tham số, đó là loại lớp, hàm đó mở rộng.

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