2012-06-23 66 views
10

Tôi đã được cọ rửa internet cố gắng tìm một cách để chứa dấu gạch ngang từ các phần tử biểu mẫu của tôi vào hành vi ràng buộc mô hình mặc định của bộ điều khiển ASP.NET trong MVC 2, 3, hoặc thậm chí 4.ASP.NET MVC Model Binding với dấu gạch ngang trong Form Element Tên

Là nhà phát triển front-end, tôi thích dấu gạch ngang trong CSS của tôi trên camelCase hoặc dấu gạch dưới. Trong đánh dấu của tôi, những gì tôi muốn để có thể làm gì để là một cái gì đó như thế này:

<input type="text" name="first-name" class="required" /> 
<input type="text" name="last-name" class="required" /> 

trong bộ điều khiển, tôi sẽ đi qua trong một đối tượng C# mà sẽ trông như thế này:

public class Person 
{ 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     //etc... 
} 

Có cách nào để mở rộng các lớp học Controller để điều này thông qua một số regex hoặc hành vi khác? Tôi ghét sự thật rằng tôi phải làm một cái gì đó như thế này:

<input type="text" name="person.firstname" class="required" /> 

hoặc ngay cả điều này:

<input type="text" name="isPersonAttending" class="required" /> 

Suy nghĩ?

+1

xem xét câu trả lời của tôi cho câu hỏi của riêng tôi về việc rút ngắn tên thuộc tính mô hình, nơi tôi hiển thị cách bí danh họ http://stackoverflow.com/questions/4316301/asp-net-mvc-2-bind-a-models-property-to-a-different tên-giá trị # answer-4316327 –

Trả lời

6

Bạn luôn có thể tạo trình kết nối mô hình của riêng bạn.

Dưới đây là một ví dụ mà thực hiện một chất kết dính có hỗ trợ thêm biệt hiệu để mô hình thuộc tính:

http://ole.michelsen.dk/blog/bind-a-model-property-to-a-different-named-query-string-field/

Và với nó làm điều gì đó như:

[ModelBinder(typeof(AliasModelBinder))] 
public class Person 
{ 
     [BindAlias("first-name")] 
     public string FirstName { get; set; } 
     [BindAlias("last-name")] 
     public string LastName { get; set; } 
     //etc... 
} 

EDIT: thi này, như blogger nói, dựa trên câu trả lời của Andras về câu hỏi SO sau: Asp.Net MVC 2 - Bind a model's property to a different named value

+1

xin lưu ý rằng, như tác giả blog nói rằng, và do đó, đây là một bản sao câu trả lời của riêng tôi ở đây: http://stackoverflow.com/questions/4316301/asp-net- mvc-2-bind-a-models-property-to-a-tên-giá trị-giá trị # answer-4316327 –

+0

Điều này là hợp lý và có ý nghĩa tuyệt vời. Cảm ơn! –

+0

Andras, bạn hoàn toàn chính xác, tôi đã không thấy tham chiếu đến câu trả lời của bạn. Xin lỗi vì điều đó. BTW, thực hiện tuyệt vời. –

3

Bằng cách tạo nhà cung cấp giá trị biểu mẫu tùy chỉnh, bạn có thể dễ dàng giải quyết vấn đề này. Ưu điểm khác là bạn có thể tránh gây ô nhiễm tất cả các thuộc tính mô hình bằng cách trang trí các thuộc tính tùy chỉnh.

Tuỳ chỉnh giá trị gia tăng Mẫu Provider

public class DashFormValueProvider : NameValueCollectionValueProvider 
{ 
    public DashFormValueProvider(ControllerContext controllerContext) 
    : base(controllerContext.HttpContext.Request.Form, 
    controllerContext.HttpContext.Request.Unvalidated().Form, 
    CultureInfo.CurrentCulture) 
    { 
    } 

    public override bool ContainsPrefix(string prefix) 
    { 
     return base.ContainsPrefix(GetModifiedPrefix(prefix)); 
    } 

    public override ValueProviderResult GetValue(string key) 
    { 
     return base.GetValue(GetModifiedPrefix(key)); 
    } 

    public override ValueProviderResult GetValue(string key, bool skipValidation) 
    { 
     return base.GetValue(GetModifiedPrefix(key), skipValidation); 
    } 

    // this will convert the key "FirstName" to "first-name". 
    private string GetModifiedPrefix(string prefix) 
    { 
     return Regex.Replace(prefix, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1-").ToLower(); 
    } 
} 

Nhà máy cung cấp giá trị gia tăng

public class DashFormValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 

     return new DashFormValueProvider(controllerContext); 
    } 
} 

Global.asax.cs

ValueProviderFactories.Factories.Add(new DashFormValueProviderFactory()); 
+0

Rất tuyệt! Tôi sẽ đồng ý với bạn - nếu bạn đang sử dụng dấu gạch ngang cho hầu hết các tên phần tử biểu mẫu của bạn, việc sử dụng các thuộc tính sẽ hơi nhiều. Cảm ơn bạn đã chia sẻ! –

+0

Đã hoạt động hết sức. –

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