Tôi muốn thuộc tính mà tôi đặt trong ViewModel để kiểm soát điều này nếu có thể.
ASP.NET MVC cung cấp hệ thống mở rộng để thực hiện chính xác điều này. Dưới đây là những gì bạn cần làm:
- Thực hiện tùy chỉnh
ModelMetadataProvider
.
- Tìm kiếm
StringLengthAttribute
hoặc MaxLengthAttribute
, trích xuất thông tin và thêm thông tin vào ModelMetadata
.
- Cung cấp mẫu Trình chỉnh sửa tùy chỉnh sử dụng thông tin.
Bước 1: Thực hiện tùy chỉnh ModelMetadataProvider
.
Tạo lớp học có nguồn gốc từ ModelMetadataProvider
. Thông thường, bạn sẽ lấy được từ số DataAnnotationsModelMetadataProvider
vì điều này cung cấp một số chức năng mặc định có nghĩa là bạn chỉ phải ghi đè lên một phương thức có tên là CreateMetadata
.
Bước 2: Giải nén thông tin:
Để có được thông tin, bạn cần phải tìm kiếm các thuộc tính, trích xuất các thông tin dài tối đa và thêm nó vào từ điển AdditionalValues
của ModelMetadata
. Việc thực hiện sẽ giống như thế này (đây là toàn bộ thực hiện):
public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(
IEnumerable<Attribute> attributes,
Type containerType,
Func<object> modelAccessor,
Type modelType,
string propertyName)
{
// Call the base class implementation to create the default metadata...
var metadata = base.CreateMetadata(
attributes,
containerType,
modelAccessor,
modelType,
propertyName);
// Extract the stringLengthAttribute (you can do the same for the
// MaxLengthAttribute if you want).
var attr = attributes
.OfType<StringLengthAttribute>()
.First();
// This could be getting called on a property that doesn't have the
// attribute so make sure you check for null!
if (attr != null)
{
metadata.AdditionalValues["maxLength"] = attr.MaximumLength;
}
return metadata;
}
}
Để cho ASP.NET MVC sử dụng này, bạn cần phải đăng ký nó trong phương pháp Application_Start
trong Global.asax
.
ModelMetadataProviders.Current = new CustomModelMetadataProvider();
Bước 3: Tạo một mẫu biên tập tùy chỉnh.
Bây giờ bạn cần tạo chế độ xem sử dụng thông tin. Tạo chế độ xem mới có tên là String
trong thư mục Views\Shared\
.
String.cshtml
@{
object maxLength;
if (!ViewData.ModelMetadata.AdditionalValues
.TryGetValue("maxLength", out maxLength))
{
maxLength = 0;
}
var attributes = new RouteValueDictionary
{
{"class", "text-box single-line"},
{ "maxlength", (int)maxLength },
};
}
@Html.TextBox("", ViewContext.ViewData.TemplateInfo.FormattedModelValue, attributes)
Khi bạn chạy ứng dụng của bạn, bạn sẽ nhận được đầu ra HTML sau bằng cách gọi @Html.EditorFor
.
<input class="text-box single-line" id="Extension" maxlength="6" name="Extension" type="text" value="" />
Nếu bạn muốn biết thêm về hệ thống cung cấp mô hình siêu dữ liệu, Brad Wilson has a series of blog posts rằng chi tiết cách thức hoạt động (những được viết trước khi công cụ xem Razor vì vậy một số quan điểm Cú pháp là một chút sôi nổi nhưng nếu không thông tin Là âm thanh).
Bạn đã xác minh xem bạn có thể đăng chuỗi dài hơn 6 ký tự không? –
Tôi nhận được một lỗi xác nhận, nhưng tôi muốn nó thực sự thiết lập thuộc tính maxlength. –
Nếu bạn thay đổi nó thành 'TextBoxFor', bạn có thể chuyển các tùy chọn HTML. –