입력에 클래스를 추가하려고합니다.
작동하지 않습니다.
@Html.EditorFor(x => x.Created, new { @class = "date" })
입력에 클래스를 추가하려고합니다.
작동하지 않습니다.
@Html.EditorFor(x => x.Created, new { @class = "date" })
답변:
Html.EditorFor
템플릿 내부에 이해가되지 않는 클래스를 추가하면 많은 다른 태그를 가질 수 있습니다. 따라서 편집기 템플릿 내에 클래스를 할당해야합니다.
@Html.EditorFor(x => x.Created)
사용자 정의 템플릿에서 :
<div>
@Html.TextBoxForModel(x => x.Created, new { @class = "date" })
</div>
ASP.NET MVC 5.1부터는 클래스를 추가 EditorFor
할 수 있습니다 (원래 질문은 ASP.NET MVC 3을 지정했으며 허용되는 답변은 여전히 고려 된 것 중 최고입니다).
@Html.EditorFor(x=> x.MyProperty,
new { htmlAttributes = new { @class = "MyCssClass" } })
일반 EditorFor에 대한 클래스를 설정할 수 없습니다. 원하는 편집기를 알고 있다면 바로 사용할 수 있으며 클래스를 설정할 수 있습니다. 사용자 정의 템플릿을 만들 필요가 없습니다.
@Html.TextBoxFor(x => x.Created, new { @class = "date" })
당신이 사용할 수있는:
@Html.EditorFor(x => x.Created, new { htmlAttributes = new { @class = "date" } })
(적어도 ASP.NET MVC 5에서는 그렇지 않지만 ASP.NET MVC 3에서는 어떻게 작동했는지 알 수 없습니다.)
나는 똑같은 좌절 문제를 겪었고 모든 DateTime 값에 적용되는 EditorTemplate을 만들고 싶지 않았습니다 ( jQuery UI 드롭 다운 캘린더가 아닌 시간을 표시하려는 UI에 시간이 있음 ). 내 연구에서 내가 겪은 근본적인 문제는 다음과 같습니다.
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
있지만 사용자 정의 "날짜 선택기"클래스를 적용 할 수는 없습니다.따라서 다음과 같은 이점이있는 사용자 지정 HtmlHelper 클래스를 만들었습니다.
이 방법은 빈 문자열로 바꿉니다.
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());
}
그리고 date-picker
클래스 데코레이션을 사용하여 달력을 렌더링하는 객체를 찾는 JQuery 구문을 알고 싶은 사람들은 다음과 같습니다.
$(document).ready(function () {
$('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
$('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});
DateTimePickerFor
과 당신이 대표하는 모델의 날짜 필드 업데이트 [DataType(DataType.Date)]
또는 [DataType(DataType.DateTime)]
? 예를 들어 mm / dd / yyyy 양식에 .ParseFormats(new string[] { "MM/dd/yyyy" })
넣거나 원하는대로 쉽게 수정할 수 있습니다. 널 (null) 인 경우 필드를 코드화하지 않고 필드가 비어있는 것으로 렌더링됩니다.
@MyHtmlHelpers.CalenderTextBoxFor(model => model.ExpirationDate)
. 이것을 구현하는 방법에 대한 아이디어가 있습니까?
AdditionalViewData를 통해 클래스 또는 기타 정보를 제공 할 수 있습니다. 사용자가 데이터베이스 필드 (propertyName, editorType 및 editorClass)를 기반으로 양식을 작성할 수있는 위치에서이 정보를 사용합니다.
초기 예를 기반으로 :
@Html.EditorFor(x => x.Created, new { cssClass = "date" })
사용자 정의 템플릿에서 :
<div>
@Html.TextBoxFor(x => x.Created, new { @class = ViewData["cssClass"] })
</div>
질문은 MVC 3.0을 대상으로했지만 MVC 4.0에서도 문제가 지속되는 것으로 나타났습니다. MVC 5.0에는 기본적으로 htmlAttributes에 대한 과부하가 포함되어 있습니다.
현재 직장에서 MVC 4.0을 사용해야하는데 JQuery 통합을 위해 CSS 클래스를 추가해야했습니다. 단일 확장 방법을 사용 하여이 문제를 해결했습니다 ...
확장 방법 :
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;
}
}
}
HTML 마크 업 사용법 :
@Html.EditorFor(expression: x => x.MyTestProperty).AddHtmlAttributes(new { @class = "form-control" })
(면도기보기에 확장 메소드의 네임 스페이스를 포함 시키십시오)
설명 :
기존 HTML에 삽입하는 것이 좋습니다. Linq-to-XML using을 사용하여 현재 요소를 구문 분석하기로 선택했습니다 XDocument.Parse()
. htmlAttributes를 type으로 전달합니다 object
. MVC를 활용RouteValueDictionary
를 하여 전달 된 htmlAttributes를 구문 분석합니다. 이미 존재하는 속성을 병합하거나 아직없는 경우 새 속성을 추가합니다.
다음을 통해 입력을 구문 분석 할 수없는 경우 XDocument.Parse()
모든 희망을 버리고 원래 입력 문자열을 반환하여 입력을 .
이제 DisplayFor (통화와 같은 데이터 유형 렌더링)의 이점을 사용할 수 있지만 CSS 클래스 (및 해당 문제에 대한 다른 속성)를 지정할 수 있습니다. data-*
또는 ng-*
(Angular) 와 같은 속성을 추가하는 데 도움이 될 수 있습니다 .
DateTime.cshtml이라는 간단한 사용자 정의 편집기를 작성하여 Views / Shared / EditorTemplates에 저장하여 동일한 동작을 작성할 수 있습니다.
@model DateTime
@{
var css = ViewData["class"] ?? "";
@Html.TextBox("", (Model != DateTime.MinValue? Model.ToString("dd/MM/yyyy") : string.Empty), new { @class = "calendar medium " + css});
}
그리고 당신의 관점에서
@Html.EditorFor(model => model.StartDate, new { @class = "required" })
내 예제에서는 두 개의 CSS 클래스와 날짜 형식을 하드 코딩하고 있습니다. 물론 변경할 수도 있습니다. 읽기 전용, 비활성화 등과 같은 다른 HTML 속성과 동일한 작업을 수행 할 수도 있습니다.
한 페이지에 하나의 텍스트 상자 크기를 설정해야했습니다. 모델의 코딩 속성과 사용자 정의 편집기 템플릿 생성이 너무 많았으므로 텍스트 상자의 크기를 지정하는 클래스를 호출하는 span 태그로 @ Html.EditorFor 호출을 래핑했습니다.
.SpaceAvailableSearch input
{
width:25px;
}
<span class="SpaceAvailableSearch">@Html.EditorFor(model => model.SearchForm.SpaceAvailable)</span>