2011-02-06 49 views
47

Tôi đang làm việc với MVC3 và sử dụng Entity Framework 4.0 Entities làm mô hình của tôi. Cho đến nay, tất cả mọi thứ hoạt động tốt như xa như sử dụng nó như là một mô hình (tất cả các hoạt động crud/thế hệ trang làm việc ra khỏi hộp). Tôi tự hỏi, tuy nhiên, làm cách nào để bạn có được các nhãn và thông tin xác thực mạnh mẽ giống như khi bạn tạo mô hình theo cách thủ công?Sử dụng System.ComponentModel.DataAnnotations with Entity Framework 4.0

Đây là ví dụ về ý tôi. Đây là một lớp được tạo ra bởi dự án mẫu MVC3:

public class LogOnModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 
} 

Với ví dụ trên, bạn có thể xác định những gì được kết xuất trong một nhãn cho trường (Display), và những loại lĩnh vực sử dụng (Password). Tuy nhiên, khi tôi cố gắng sử dụng khung thực thể và đẩy nó vào chế độ xem bên dưới, tôi thấy các nhãn được tạo tự động chỉ là tên trường và không phải bất kỳ điều gì tôi muốn người dùng xem/phải đọc:

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.FirstName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.FirstName) 
      @Html.ValidationMessageFor(model => model.FirstName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.MiddleName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.MiddleName) 
      @Html.ValidationMessageFor(model => model.MiddleName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.LastName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.LastName) 
      @Html.ValidationMessageFor(model => model.LastName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Birthdate) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Birthdate) 
      @Html.ValidationMessageFor(model => model.Birthdate) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset>} 

enter image description here

Câu hỏi của tôi là: Làm cách nào để thêm các trang trí bổ sung này vào thực thể được tạo bằng EF4? Có gì ngoài System.ComponentModel.DataAnnotations mà tôi nên sử dụng không? Tôi biết các thực thể được tái tạo và có lẽ không phải là một ý tưởng tốt để thêm mã này vào mã của các thực thể trực tiếp, nhưng vì một lý do nào đó tôi không thể nghĩ ra cách tiếp cận tốt hơn là nhập văn bản nhãn vào chế độ xem (lame, không có lý do gì để phải làm điều đó, đây là MVC!). Tôi muốn giữ nó để ứng dụng đủ năng động để có thể có thông tin hiển thị chính xác cho mô hình của tôi đi qua và giữ một cách tiếp cận MVC. Tôi phải làm nó như thế nào?

+0

Related: http://stackoverflow.com/q/2999936/11912 –

Trả lời

71

Tôi chưa làm điều này cho ASP.NET MVC (chỉ dành cho Silverlight) nhưng tôi tin rằng các nguyên tắc tương tự sẽ áp dụng. Bạn có thể tạo "lớp bạn thân siêu dữ liệu" như dưới đây, vì các loại được tạo bởi EF nên là một phần, do đó bạn có thể thêm một chút cho chúng (như MetadataTypeAttribute) và sau đó bạn tạo lớp anh chị em này chứa siêu dữ liệu.

Đó là loại xấu xí, nhưng nên hoạt động. Nó đi một cái gì đó như thế này (giả sử các thực thể EF được đặt tên "Person"):

[MetadataType(typeof(PersonMetadata))] 
public partial class Person { 
    // Note this class has nothing in it. It's just here to add the class-level attribute. 
} 

public class PersonMetadata { 
    // Name the field the same as EF named the property - "FirstName" for example. 
    // Also, the type needs to match. Basically just redeclare it. 
    // Note that this is a field. I think it can be a property too, but fields definitely should work. 

    [Required] 
    [Display(Name = "First Name")] 
    public string FirstName; 
} 
+0

Huh, đó là một cách tiếp cận thú vị. Tôi se thử no. –

+2

Hoạt động hoàn hảo. Cảm ơn, Austin! –

+0

cảm ơn mẫu.Bạn có biết cơ hội để có thể đặt xác nhận được gán vào khung thực thể mô hình đầu tiên như một thuộc tính của thuộc tính thực thể có thể là gì? –

1

Tương tự như trên nhưng với tất cả các chi tiết, và nó hoạt động

enter image description here

enter image description here

enter image description here

enter image description here

Và đây là Bộ luật

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 

namespace Validate.Models 
{ 
    [MetadataType(typeof(PersonMetadata))] 
    public partial class Person 
    { 
     // Note this class has nothing in it. It's just here to add the class-level attribute. 
    } 

    public class PersonMetadata 
    { 
     // Name the field the same as EF named the property - "FirstName" for example. 
     // Also, the type needs to match. Basically just redeclare it. 
     // Note that this is a field. I think it can be a property too, but fields definitely should work. 

     [Required] 
     [Display(Name = "Enter Your Name")] 
     public string FirstName; 
    } 
} 
0

Giống như câu trả lời Austin Chiên Con 's, nhưng thay vào đó, làm tổ lớp MetaData trong lớp thực thể, do đó làm giảm số lượng các lớp học trong danh sách namespace công cộng của bạn, và loại bỏ sự cần phải có một tên duy nhất cho mỗi lớp siêu dữ liệu.

using System.ComponentModel.DataAnnotations; 

namespace Validate.Models 
{ 
    [MetadataType(typeof(MetaData))] 
    public partial class Person 
    { 
     public class MetaData 
     { 
      [Required] 
      [Display(Name = "Enter Your Name")] 
      public string FirstName; 

      //... 
     } 
    } 
} 
Các vấn đề liên quan