2012-06-18 40 views
18

Vấn đềLàm thế nào để có được một chìa khóa ModelState của một mục trong danh sách

Tôi có một danh sách các lĩnh vực mà người dùng có thể chỉnh sửa. Khi mô hình được gửi, tôi muốn kiểm tra xem các mục này có hợp lệ hay không. Tôi không thể sử dụng ký hiệu dữ liệu vì mỗi trường có một quy trình xác thực khác mà tôi sẽ không biết cho đến khi chạy. Nếu xác nhận không thành công, tôi sử dụng ModelState.AddModelError(string key, string error) trong đó khóa là tên của phần tử html bạn muốn thêm thông báo lỗi vào. Vì có một danh sách các trường tên mà Razor tạo cho mục html giống như Fields[0].DisplayName. Câu hỏi của tôi là có một phương pháp hoặc một cách để có được chìa khóa của tên html được tạo ra từ mô hình xem?

Đã cố gắng giải pháp

Tôi đã thử các phương pháp toString() cho phím không có may mắn. Tôi cũng đã xem qua lớp HtmlHelper nhưng tôi không thấy bất kỳ phương pháp hữu ích nào.

Code Snippet

Xem Mẫu

public class CreateFieldsModel 
{ 
    public TemplateCreateFieldsModel() 
    { 
     FreeFields = new List<FieldModel>(); 
    } 

    [HiddenInput(DisplayValue=false)] 
    public int ID { get; set; } 

    public IList<TemplateFieldModel> FreeFields { get; set; } 


    public class TemplateFieldModel 
    { 
     [Display(Name="Dispay Name")] 
     public string DisplayName { get; set; } 

     [Required] 
     [Display(Name="Field")] 
     public int FieldTypeID { get; set; } 
    } 
} 

khiển

public ActionResult CreateFields(CreateFieldsModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Where do I get the key from the view model? 
     ModelState.AddModelError(model.FreeFields[0], "Test Error"); 
     return View(model); 
    } 
} 

Trả lời

24

Sau khi tìm hiểu mã nguồn, tôi đã tìm thấy giải pháp. Có một lớp được gọi là ExpressionHelper được sử dụng để tạo tên html cho trường khi EditorFor() được gọi. Lớp ExpressionHelper có phương thức được gọi là GetExpressionText() trả về một chuỗi là tên của phần tử html đó. Đây là cách sử dụng nó ...

for (int i = 0; i < model.FreeFields.Count(); i++) 
{ 
    //Generate the expression for the item 
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value; 
    //Get the name of our html input item 
    string key = ExpressionHelper.GetExpressionText(expression); 
    //Add an error message to that item 
    ModelState.AddModelError(key, "Error!"); 
} 

if (!ModelState.IsValid) 
{ 
    return View(model); 
} 
+4

Điều này là tốt nhưng đã chỉ tìm thấy một bài đăng mà kết thúc tốt đẹp logic này trong một phương pháp mở rộng tốt đẹp: http://stackoverflow.com/a/12689563/1825109 – Michael12345

0

Bạn phải khung phím (tên của yếu tố đầu vào) bên trong bộ điều khiển dựa khi bạn vẽ f ields trong các hình thức.

Ví dụ: nếu việc xác thực mục thứ hai trong bộ sưu tập FreeFields của CreateFieldsModel không thành công, bạn có thể đặt tên của phần tử đầu vào tức là khóa là FreeFields[1].DisplayName nơi lỗi xác thực sẽ được ánh xạ.

Theo như tôi biết bạn không thể dễ dàng có được điều đó từ bộ điều khiển.

+0

Vì vậy, có thể có trường ẩn trong đó tên là giá trị không đổi và giá trị của trường là đầu ra của phương thức EditorFor ngoại trừ nhận thuộc tính tên? –

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