2012-07-09 19 views
12

Tôi đang sử dụng C# cùng với một ViewModel chuyển mô hình xem từ bộ điều khiển đến khung nhìn.{get; bộ; } được sử dụng trong ViewModel

Trong mô hình quan điểm của tôi, sau đây dường như làm việc như mong đợi vì nó truyền thông tin Mô tả từ cái nhìn trở lại với bộ điều khiển:

public string Description { get; set; } 

Nhưng nếu tôi có những điều sau đây, nó sẽ không vượt qua trở lại Mô tả. Mô tả hiển thị null

public string Description 

Tại sao là {get; bộ; }

rất quan trọng?

Trả lời

17

Tôi không biết nhiều về asp.net MVC/Razor, nhưng có sự khác biệt quan trọng giữa 2 mẫu mã của bạn.

public string Description { get; set; } 

Tạo thuộc tính riêng, khi được tạo, có một phương thức nhận/đặt truy cập trường. Một tài sản khai báo với {get; set;} là tương đương với:

private string _description; 
    public string Description 
    { 
     get 
     { 
      return _description; 
     } 
     set 
     { 
      this._description = value; 
     } 
    } 

Tuy nhiên sau:

public string Description; 

Tạo một lĩnh vực công cộng đơn giản.

Đoán của tôi là dao cạo sử dụng sự phản chiếu để lấy giá trị từ ViewModel và có lẽ nó sẽ tìm kiếm một thuộc tính chứ không phải một trường. Vì vậy, nó xác định rằng tài sản không tồn tại, do đó trở về null

+0

này nghe có vẻ ngu ngốc, nhưng là có một cách để tùy chỉnh "giá trị" đó được chuyển tới bộ đặt? Tôi đã mong đợi để xem thiết lập (chuỗi giá trị) – Worthy7

+0

@ Worthy7 Tôi không hiểu những gì bạn có nghĩa là "tùy chỉnh". giá trị là từ khóa theo ngữ cảnh ngôn ngữ khi khai báo thuộc tính, loại của nó được xác định bởi loại thuộc tính. Đó là từ khóa hoạt động chính xác như tham số phương thức.Ví dụ bạn có thể gán lại nó nếu bạn muốn. –

+0

@ Worthy7 https://msdn.microsoft.com/en-CA/library/a1khb4f8.aspx –

8

Cú pháp dưới đây là một tính năng ngôn ngữ C# 'tính chất tự động'.

public string Description { get; set; } 

ASP.NET MVC sử dụng reflectiondata-binding chỉ hoạt động với các thuộc tính chứ không phải biến. Sử dụng các thuộc tính cho truy cập công cộng là cách để đi.

Đề nghị đọc this bài viết nơi tác giả rút lại 'không thích' của mình cho các thuộc tính công khai.

1

default model binder là một trong đó liên kết giá trị yêu cầu với thuộc tính trong mô hình. Nó liên kết các giá trị chỉ với thuộc tính get-set công khai và thậm chí không đến các trường công khai.

Nếu bạn muốn ràng buộc các giá trị vào các trường thì bạn phải viết trình kết nối mô hình của riêng bạn nhưng các thuộc tính công khai hoặc tốt hơn các trường công khai để bạn không cần.

0

Đó là một cái gọi là sở hữu ô tô, và về cơ bản là một cách viết tắt sau (mã tương tự sẽ được tạo ra bởi trình biên dịch):

private string name; 
public string Name 
{ 
    get 
    { 
     return this.name; 
    } 
    set 
    { 
     this.name = value; 
    } 
} 
Các vấn đề liên quan