2011-08-29 20 views
8

Tôi biết trên tập tin Razor View, chúng tôi có thể làm một cái gì đó như thế này @ Html.TextBox ("username", null, new {maxlength = 20 , autocomplete = "off"})ASP.NET MVC 3 - Dữ liệu Annoation và Max Length/Kích thước cho Textbox Rendering

Tuy nhiên, tôi hy vọng sẽ tạo mô hình cho MVC có thể được sử dụng để tạo biểu mẫu có xác định rõ kích thước và độ dài tối đa của hộp văn bản. Tôi cố gắng [StringLength (n)] trên đầu trang của các thuộc tính của mô hình, nhưng điều đó dường như chỉ làm việc xác nhận thay vì thiết lập kích thước của hộp văn bản.

Có cách nào để chúng tôi có thể xác định độ dài của trường văn bản dưới dạng chú thích dữ liệu ở trên cùng thuộc tính của mô hình không? Vì vậy, cuối cùng, chúng ta chỉ có thể tạo ra toàn bộ biểu mẫu bằng cách sử dụng dao cạo để ánh xạ tới một mô hình thay vì nhận một cách rõ ràng các đặc tính mô hình từng cái một để đặt kích thước hộp văn bản.

Trả lời

14

Đây là một phác thảo của một helper tùy chỉnh mà sử dụng StringLengthAttribute.

public class MyModel 
{ 
    [StringLength(50)] 
    public string Name{get; set;} 
} 

public MvcHtmlString MyTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression) 
{ 

    var attributes = new Dictionary<string, Object>(); 
    var memberAccessExpression = (MemberExpression)expression.Body; 
    var stringLengthAttribs = memberAccessExpression.Member.GetCustomAttributes(
     typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), true); 

    if (stringLengthAttribs.Length > 0) 
    { 
     var length = ((StringLengthAttribute)stringLengthAttribs[0]).MaximumLength; 

     if (length > 0) 
     { 
      attributes.Add("size", length); 
      attributes.Add("maxlength", length); 
     } 
    } 

    return helper.TextBoxFor(expression, attributes); 
} 
+0

Điều đó có vẻ tuyệt vời! Nó sẽ có thể có một cái gì đó tương tự như những gì bạn đề cập ở trên để được sử dụng trong Html.EditorForModel()? Cảm ơn sự giúp đỡ của bạn. – frostshoxx

+0

@frostshoxx Bạn có thể làm điều đó bằng cách sử dụng [UIHintAttribute] (http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.uihintattribute.aspx) và tạo mẫu tùy chỉnh cho từng loại dữ liệu. Tôi đã không thử điều này mặc dù. – Eranga

3

Điều này có hiệu quả không?

public class ViewModel 
{ 
    [StringLength(20)] 
    public string UserName {get;set;} 
} 

Trong Xem:

@Html.TextBoxFor(x => x.UserName, new {autocomplete = "off"}) 

hay:

@Html.EditorFor(x => x.UserName) 
+2

Cú pháp bạn đã đề cập là chính xác, nhưng tôi hy vọng chỉ cần gọi @ Html.EditorForModel() và làm cho nó hiển thị tất cả các trường từ mô hình thay vì hiển thị từng trường một cách rõ ràng. Ngoài ra, tôi cũng muốn có thể xác định kích thước của các trường văn bản như là một phần của thẻ chú thích dữ liệu. Lưu ý rằng có [StringLength (20)] dường như không đặt kích thước của trường văn bản thành 20. Tôi hy vọng điều này sẽ làm rõ hơn một chút .. Cảm ơn bạn! – frostshoxx

+0

@frostshoxx Chỉ định logic trình bày như kích thước trường văn bản trong mô hình vi phạm các nguyên tắc cốt lõi của MVC. Trừ khi bạn có nghĩa là maxlength .. – redwards510

2

tôi thấy rằng tôi thích quan điểm của tôi chỉ cần Gọi Html.EditorFor (...). Điều này có nghĩa là các mẫu Trình chỉnh sửa và Hiển thị quyết định số phận của các điều khiển theo quan điểm của tôi, như vậy mã xem của tôi được làm sạch rất nhiều - nó chỉ có các yêu cầu html và chung cho các trình soạn thảo.

Các liên kết dưới đây cho một mẫu làm việc của nhận làm việc này trong một biên tập Template https://jefferytay.wordpress.com/2011/12/20/asp-net-mvc-string-editor-template-which-handles-the-stringlength-attribute/

Tôi đang sử dụng tương tự trong String.cshtml biên tập Template của tôi (đi trong Shared/EditorTemplates) .

@model object 
@using System.ComponentModel.DataAnnotations 
@{ 
    ModelMetadata meta = ViewData.ModelMetadata; 
    Type tModel = meta.ContainerType.GetProperty(meta.PropertyName).PropertyType; 
} 
@if(typeof(string).IsAssignableFrom(tModel)) { 

    var htmlOptions = new System.Collections.Generic.Dictionary<string, object>(); 

    var stringLengthAttribute = (StringLengthAttributeAdapter)ViewData.ModelMetadata.GetValidators(this.ViewContext.Controller.ControllerContext).Where(v => v is StringLengthAttributeAdapter).FirstOrDefault(); 
    if (stringLengthAttribute != null && stringLengthAttribute.GetClientValidationRules().First().ValidationParameters["max"] != null) 
    { 
     int maxLength = (int)stringLengthAttribute.GetClientValidationRules().First().ValidationParameters["max"]; 

     htmlOptions.Add("maxlength", maxLength); 

     if (maxLength < 20) 
     { 
      htmlOptions.Add("size", maxLength); 
     } 
    } 

    htmlOptions.Add("class", "regular-field"); 

    <text> 
     @Html.TextBoxFor(m => m, htmlOptions) 
    </text> 
} 
else if(typeof(Enum).IsAssignableFrom(tModel)) { 
    //Show a Drop down for an enum using: 
    //Enum.GetValues(tModel) 
    //This is beyond this article 
} 
//Do other things for other types... 

Sau đó mô hình của tôi được chú thích như:

[Display(Name = "Some Field", Description = "Description of Some Field")] 
[StringLength(maximumLength: 40, ErrorMessage = "{0} max length {1}.")] 
public string someField{ get; set; } 

Xem tôi chỉ đơn giản gọi:

<div class="editor-label"> 
    @Html.LabelWithTooltipFor(model => model.something.someField) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.something.someField) 
    @Html.ValidationMessageFor(model => model.something.someField) 
</div> 

Bạn cũng có thể nhận thấy rằng biên tập viên Template String.cshtml của tôi cũng tự động xử lý kỳ diệu của Enum, nhưng đó là bắt đầu từ digress từ chủ đề hiện tại, vì vậy tôi nixed c ode, tôi sẽ chỉ nói ở đây rằng Chuỗi Trình chỉnh sửa chuỗi có thể kéo thêm trọng lượng và có khả năng google có đôi chút trên đó https://www.google.com/search?q=string+editor+template+enum

Nhãn với Tooltip For là trình trợ giúp HTML tùy chỉnh chỉ cần mô tả vào tiêu đề nhãn, cho thêm thông tin về việc di chuột qua từng nhãn.

Tôi muốn giới thiệu phương pháp này nếu bạn muốn thực hiện điều này trong một Mẫu biên tập .

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