[asp.net-mvc] ASP.NET MVC 3 Razor-EditorFor에 클래스 추가

입력에 클래스를 추가하려고합니다.

작동하지 않습니다.

@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" } })

참조 : ASP.NET MVC 5.1의 새로운 기능, 편집기 템플릿에 대한 부트 스트랩 지원


답변

일반 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에 시간이 있음 ). 내 연구에서 내가 겪은 근본적인 문제는 다음과 같습니다.

  • 표준 TextBoxFor 도우미를 사용하면 눈에 잘 띄지 않는 jQuery UI 캘린더를 렌더링하기 위해 “날짜 선택 도구”의 사용자 정의 클래스를 적용 할 수 있었지만 TextBoxFor는 시간없이 DateTime의 형식을 지정하지 않아 달력 렌더링에 실패했습니다.
  • 표준 EditorFor 는 DateTime을 형식화 된 문자열로 표시합니다 (와 같은 적절한 속성으로 장식되어 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]있지만 사용자 정의 “날짜 선택기”클래스를 적용 할 수는 없습니다.

따라서 다음과 같은 이점이있는 사용자 지정 HtmlHelper 클래스를 만들었습니다.

  • 이 메소드는 DateTime을 jQuery 달력에 필요한 ShortDateString으로 자동 변환합니다 (시간이 있으면 jQuery가 실패 함).
  • 기본적으로 도우미는 jQuery 캘린더를 표시하기 위해 필요한 htmlAttributes를 적용하지만 필요한 경우 재정의 할 수 있습니다.
  • 날짜가 null 인 경우 ASP.NET MVC는 날짜를 1/1/0001의 값으로 설정합니다.

이 방법은 빈 문자열로 바꿉니다.

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');
});


답변

AdditionalViewData를 통해 클래스 또는 기타 정보를 제공 할 수 있습니다. 사용자가 데이터베이스 필드 (propertyName, editorType 및 editorClass)를 기반으로 양식을 작성할 수있는 위치에서이 정보를 사용합니다.

초기 예를 기반으로 :

@Html.EditorFor(x => x.Created, new { cssClass = "date" })

사용자 정의 템플릿에서 :

<div>
    @Html.TextBoxFor(x => x.Created, new { @class = ViewData["cssClass"] })
</div>


답변

EditorFor속성이 어떤 태그, 특히 내장 편집기 템플릿의 속성으로 추가되는 익명 객체를 전달할 수 있는 재정의 는 없습니다 . 고유 한 사용자 정의 편집기 템플릿을 작성하고 추가 값으로 원하는 값을 전달해야합니다.