2008-11-12 29 views
9

làm cách nào để thực hiện như sau, với ASP.NET MVC UpdateModel? Tôi đang cố gắng đọc trong một dữ liệu hộp văn bản bị xóa không gian (chính xác như hộp văn bản TAGS trong một câu hỏi StackOverflow mới, chẳng hạn như này) vào mô hình.Cập nhật ASP.NET MVCMô hình với trường nhập dữ liệu phức tạp sorta

ví dụ:

<input type="Tags" type="text" id="Tags" name="Tags"/> 

... 

public class Question 
{ 
    public string Title { get; set; } 
    public string Body { get; set; } 
    public LazyList<string> Tags { get; set; } 
} 

.... 

var question = new Question(); 
this.UpdateModel(question, new [] { "Title", "Body", "Tags" }); 

thuộc tính Thẻ không được khởi tạo, nhưng nó chỉ chứa một mục, là toàn bộ dữ liệu được nhập vào trường Nhập thẻ. Nếu tôi muốn có một mục duy nhất trong Danh sách (dựa trên Tách chuỗi thông qua không gian) .. thực hành tốt nhất là xử lý việc này là gì, xin vui lòng?

cổ vũ!

Trả lời

8

Những gì bạn cần làm là mở rộng DefaultValueProvider thành của riêng bạn. Trong nhà cung cấp giá trị của bạn mở rộng GetValue (tên) để phân chia các thẻ và tải vào LazyList của bạn. Bạn cũng sẽ cần phải thay đổi cuộc gọi của bạn để UpdateModel:

UpdateModel(q, new[] { "Title", "Body", "Tags" }, 
    new QuestionValueProvider(this.ControllerContext)); 

Các QuestionValueProvider tôi đã viết là:

public class QuestionValueProvider : DefaultValueProvider 
    { 
     public QuestionValueProvider(ControllerContext controllerContext) 
      : base(controllerContext) 
     { 
     } 
     public override ValueProviderResult GetValue(string name) 
     { 
      ValueProviderResult value = base.GetValue(name); 
      if (name == "Tags") 
      { 
       List<string> tags = new List<string>(); 
       string[] splits = value.AttemptedValue.Split(' '); 
       foreach (string t in splits) 
        tags.Add(t); 

       value = new ValueProviderResult(tags, null, value.Culture); 
      } 
      return value; 
     } 
    } 

Hope this helps

+0

vâng! chắc chắn không! Bây giờ tôi tự hỏi nếu nó có giá trị làm tất cả điều đó, thay vì chỉ làm một UpdateModel với "tiêu đề" và "cơ thể", sau đó tự thiết lập các tài sản Tags, sau khi tôi gọi Yêu cầu ["Thẻ"] và chia? –

+0

@John - chỉ để tiếp tục chủ đề này, khi tôi thêm <% = Html.ValidationMessage ("Thẻ")%> vào html, nó bây giờ tự động hoàn thành hộp văn bản với System.Collections.Generic.List'1 [Foo.Models .Nhãn]. Thứ nhất, đó là một danh sách chuỗi lười biếng và không phải một trong các lớp Thẻ tùy chỉnh khác của tôi. Làm thế nào tôi có thể sửa lỗi này? –

+0

Giải pháp này hiện đã lỗi thời với MVC RC2 hiện tại? – a7drew

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