Tôi đang cố gắng thêm một lớp vào một đầu vào.
Đây không phải là làm việc:
@Html.EditorFor(x => x.Created, new { @class = "date" })
Tôi đang cố gắng thêm một lớp vào một đầu vào.
Đây không phải là làm việc:
@Html.EditorFor(x => x.Created, new { @class = "date" })
Câu trả lời:
Thêm một lớp để Html.EditorFor
không có ý nghĩa như trong mẫu của nó, bạn có thể có nhiều thẻ khác nhau. Vì vậy, bạn cần chỉ định lớp bên trong mẫu trình soạn thảo:
@Html.EditorFor(x => x.Created)
và trong mẫu tùy chỉnh:
<div>
@Html.TextBoxForModel(x => x.Created, new { @class = "date" })
</div>
Kể từ ASP.NET MVC 5.1, việc thêm một lớp vào một EditorFor
là có thể (câu hỏi ban đầu chỉ định ASP.NET MVC 3, và câu trả lời được chấp nhận vẫn là tốt nhất với câu hỏi được xem xét).
@Html.EditorFor(x=> x.MyProperty,
new { htmlAttributes = new { @class = "MyCssClass" } })
Xem: Có gì mới trong ASP.NET MVC 5.1, hỗ trợ Bootstrap cho các mẫu biên tập
Bạn không thể thiết lập lớp cho EditorFor chung. Nếu bạn biết trình soạn thảo mà bạn muốn, bạn có thể sử dụng nó ngay lập tức, ở đó bạn có thể thiết lập lớp. Bạn không cần phải xây dựng bất kỳ mẫu tùy chỉnh nào.
@Html.TextBoxFor(x => x.Created, new { @class = "date" })
Bạn có thể dùng:
@Html.EditorFor(x => x.Created, new { htmlAttributes = new { @class = "date" } })
(Ít nhất là với ASP.NET MVC 5, nhưng tôi không biết điều đó như thế nào với ASP.NET MVC 3.)
Tôi cũng gặp vấn đề khó chịu tương tự và tôi không muốn tạo Trình soạn thảo áp dụng cho tất cả các giá trị DateTime (có những lúc trong UI của tôi nơi tôi muốn hiển thị thời gian và không phải lịch thả xuống UI UI ). Trong nghiên cứu của tôi, các vấn đề gốc tôi gặp phải là:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
, nhưng nó sẽ không cho phép tôi áp dụng lớp "chọn ngày" tùy chỉnh.Do đó, tôi đã tạo lớp HtmlHelper tùy chỉnh có các lợi ích sau:
Phương pháp này thay thế bằng một chuỗi rỗng.
public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, htmlAttributes ?? new { @class = "text-box single-line date-picker" });
var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString());
var xElement = xDoc.Element("input");
if (xElement != null)
{
var valueAttribute = xElement.Attribute("value");
if (valueAttribute != null)
{
valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString();
if (valueAttribute.Value == "1/1/0001")
valueAttribute.Value = string.Empty;
}
}
return new MvcHtmlString(xDoc.ToString());
}
Và đối với những người muốn biết cú pháp JQuery tìm kiếm các đối tượng có date-picker
trang trí lớp để hiển thị lịch, thì đây là:
$(document).ready(function () {
$('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
$('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});
DateTimePickerFor
và cập nhật trường ngày của mô hình mà bạn đại diện với [DataType(DataType.Date)]
hoặc [DataType(DataType.DateTime)]
? Bạn cũng có thể đặt nó vào dạng giả sử mm / dd / yyyy với .ParseFormats(new string[] { "MM/dd/yyyy" })
(hoặc sửa đổi nó thành bất cứ điều gì bạn muốn, một cách dễ dàng). Nếu không có giá trị, trường sẽ hiển thị trống mà không phải mã hóa.
@MyHtmlHelpers.CalenderTextBoxFor(model => model.ExpirationDate)
. Bất kỳ ý tưởng về cách thực hiện điều này?
Có thể cung cấp một lớp hoặc thông tin khác thông qua ExtraViewData - Tôi sử dụng điều này khi tôi cho phép người dùng tạo biểu mẫu dựa trên các trường cơ sở dữ liệu (propertyName, EditorType và EditorClass).
Dựa trên ví dụ ban đầu của bạn:
@Html.EditorFor(x => x.Created, new { cssClass = "date" })
và trong mẫu tùy chỉnh:
<div>
@Html.TextBoxFor(x => x.Created, new { @class = ViewData["cssClass"] })
</div>
Không có bất kỳ EditorFor
ghi đè nào cho phép bạn chuyển vào một đối tượng ẩn danh có thuộc tính bằng cách nào đó sẽ được thêm làm thuộc tính trên một số thẻ, đặc biệt là đối với các mẫu trình soạn thảo tích hợp. Bạn sẽ cần phải viết mẫu trình soạn thảo tùy chỉnh của riêng bạn và chuyển giá trị bạn muốn dưới dạng viewdata bổ sung.
@Html.EditorFor(m=>m.Created ...)
không cho phép bất kỳ đối số nào được truyền vào cho hộp Văn bản
Đây là cách bạn có thể áp dụng các thuộc tính.
@Html.TextBoxFor(m=>m.Created, new { @class= "date", Name ="myName", id="myId" })
Sử dụng jQuery, bạn có thể thực hiện dễ dàng:
$("input").addClass("class-name")
Đây là thẻ đầu vào của bạn
@Html.EditorFor(model => model.Name)
Đối với DropDownlist, bạn có thể sử dụng cái này:
$("select").addClass("class-name")
Đối với danh sách thả xuống:
@Html.DropDownlistFor(model=>model.Name)
Trong khi câu hỏi được nhắm mục tiêu tại MVC 3.0, chúng tôi cũng thấy vấn đề vẫn tồn tại trong MVC 4.0. MVC 5.0 hiện bao gồm quá tải cho htmlAttribution.
Tôi buộc phải sử dụng MVC 4.0 tại nơi làm việc hiện tại của mình và cần thêm một lớp css để tích hợp JQuery. Tôi đã giải quyết vấn đề này bằng một phương pháp mở rộng duy nhất ...
Phương pháp mở rộng:
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using System.Xml.Linq;
namespace MyTest.Utilities
{
public static class MVCHelperExtensionMethods
{
public static MvcHtmlString AddHtmlAttributes(this MvcHtmlString input, object htmlAttributes)
{
// WE WANT TO INJECT INTO AN EXISTING ELEMENT. IF THE ATTRIBUTE ALREADY EXISTS, ADD TO IT, OTHERWISE
// CREATE THE ATTRIBUTE WITH DATA VALUES.
// USE XML PARSER TO PARSE HTML ELEMENT
var xdoc = XDocument.Parse(input.ToHtmlString());
var rootElement = (from e in xdoc.Elements() select e).FirstOrDefault();
// IF WE CANNOT PARSE THE INPUT USING XDocument THEN RETURN THE ORIGINAL UNMODIFIED.
if (rootElement == null)
{
return input;
}
// USE RouteValueDictionary TO PARSE THE NEW HTML ATTRIBUTES
var routeValueDictionary = new RouteValueDictionary(htmlAttributes);
foreach (var routeValue in routeValueDictionary)
{
var attribute = rootElement.Attribute(routeValue.Key);
if (attribute == null)
{
attribute = new XAttribute(name: routeValue.Key, value: routeValue.Value);
rootElement.Add(attribute);
}
else
{
attribute.Value = string.Format("{0} {1}", attribute.Value, routeValue.Value).Trim();
}
}
var elementString = rootElement.ToString();
var response = new MvcHtmlString(elementString);
return response;
}
}
}
Cách sử dụng đánh dấu HTML:
@Html.EditorFor(expression: x => x.MyTestProperty).AddHtmlAttributes(new { @class = "form-control" })
(Đảm bảo bao gồm không gian tên của phương thức tiện ích mở rộng trong chế độ xem dao cạo)
Giải thích:
Ý tưởng là đưa vào HTML hiện có. Tôi đã chọn phân tích thành phần hiện tại bằng cách sử dụng Linq-to-XML bằng cách sử dụng XDocument.Parse()
. Tôi vượt qua các htmlAttribution như loại object
. Tôi sử dụng MVC RouteValueDictionary
để phân tích các htmlAttribution được truyền vào. Tôi hợp nhất các thuộc tính nơi chúng đã tồn tại hoặc thêm một thuộc tính mới nếu nó chưa tồn tại.
Trong trường hợp đầu vào không thể phân tích cú pháp bởi XDocument.Parse()
tôi từ bỏ tất cả hy vọng và trả về chuỗi đầu vào ban đầu.
Bây giờ tôi có thể sử dụng lợi ích của DisplayFor (hiển thị các kiểu dữ liệu như tiền tệ một cách thích hợp) nhưng cũng có khả năng chỉ định các lớp css (và bất kỳ thuộc tính nào khác cho vấn đề đó). Có thể hữu ích để thêm các thuộc tính nhưdata-*
, hoặc ng-*
(Angular).
Bạn có thể tạo cùng một hành vi tạo một trình soạn thảo tùy chỉnh đơn giản có tên DateTime.cshtml, lưu nó trong Lượt xem / Chia sẻ / Trình soạn thảo
@model DateTime
@{
var css = ViewData["class"] ?? "";
@Html.TextBox("", (Model != DateTime.MinValue? Model.ToString("dd/MM/yyyy") : string.Empty), new { @class = "calendar medium " + css});
}
và theo quan điểm của bạn
@Html.EditorFor(model => model.StartDate, new { @class = "required" })
Lưu ý rằng trong ví dụ của tôi, tôi mã hóa cứng hai lớp css và định dạng ngày. Tất nhiên, bạn có thể thay đổi điều đó. Bạn cũng có thể làm tương tự với các thuộc tính html khác, như chỉ đọc, bị vô hiệu hóa, v.v.
Tôi đã sử dụng một giải pháp khác bằng cách sử dụng các bộ chọn thuộc tính CSS để có được những gì bạn cần.
Chỉ ra thuộc tính HTML mà bạn biết và đặt theo kiểu tương đối bạn muốn.
Giống như dưới đây:
input[type="date"]
{
width: 150px;
}
Không cần tạo mẫu tùy chỉnh cho MVC 4. Sử dụng TextBox thay vì EditFor ở đây các thuộc tính html đặc biệt không được hỗ trợ, nó chỉ được hỗ trợ từ MVC 5. TextBox nên hỗ trợ cho MVC 4, tôi không biết về phiên bản khác.
@Html.TextBox("test", "", new { @id = "signupform", @class = "form-control", @role = "form",@placeholder="Name" })
Bạn cũng có thể làm điều đó thông qua jQuery:
$('#x_Created').addClass(date);
Tôi chỉ cần đặt kích thước của một hộp văn bản trên một trang. Các thuộc tính mã hóa trên mô hình và tạo các mẫu trình soạn thảo tùy chỉnh là quá mức cần thiết, vì vậy tôi chỉ gói cuộc gọi @ Html.EditorFor bằng một thẻ span gọi là một lớp chỉ định kích thước của hộp văn bản.
.SpaceAvailableSearch input
{
width:25px;
}
<span class="SpaceAvailableSearch">@Html.EditorFor(model => model.SearchForm.SpaceAvailable)</span>
Một cách tốt nhất để áp dụng lớp vào @Html.EditorFor()
trong MVC3 RAzor là
@Html.EditorFor(x => x.Created)
<style type="text/css">
#Created
{
background: #EEE linear-gradient(#EEE,#EEE);
border: 1px solid #adadad;
width:90%;
}
</style>
Nó sẽ thêm phong cách trên vào của bạn EditorFor()
Nó hoạt động cho MVC3.