ASP.NET MVC 3 Razor-EditorFor에 클래스 추가


189

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

작동하지 않습니다.

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

1
이봐, 너도 그 이름을 알았어! -(내 코드)
Pinch

1
참고 : 일부 답변의 경우 정확한 경우에도 브라우저 캐시를 비워야이를 실현할 수 있습니다. 솔루션이 CSS 기반이거나 CSS 클래스와 관련된 경우 특히 그렇습니다! 약간 다른 문제로 그것을 깨닫는 데 꽤
오랜

답변:


183

Html.EditorFor템플릿 내부에 이해가되지 않는 클래스를 추가하면 많은 다른 태그를 가질 수 있습니다. 따라서 편집기 템플릿 내에 클래스를 할당해야합니다.

@Html.EditorFor(x => x.Created)

사용자 정의 템플릿에서 :

<div>
    @Html.TextBoxForModel(x => x.Created, new { @class = "date" })
</div>

5
감사합니다. 모델의 DisplayFormat 주석에 따라 필드 값을 형식화하는 데 문제가 있습니다. 누군가가 내가 부족 뭔가 날 지점 수 없다면 나는, 사용자 지정 서식 파일을 사용해야합니다 같은 EditorFor 및 DisplayFor 있지만 TextBoxFor :( 외모로 주석으로 포맷.?

TextBoxFor가 DisplayFormat 세트를 준수하지 않는 동일한 문제가 있습니다.
jocull

14
이것은 ModelTom의 GroundController입니다.보기를 보내고 가장 MVC 방식으로 떠 있습니다.
Trent Stewart

3
나는 같은 문제를 가지고,하지만 난 편집기 나 디스플레이와 함께 작동 DisplayFormat을 필요로하는 내가 TextBoxFor을 사용할 수 없습니다, 그러나 동시에 나는 필요 클래스에 너무, 그래서 읽기 전용 형태로 텍스트를 표시 할 수있는
AT

153

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의 새로운 기능, 편집기 템플릿에 대한 부트 스트랩 지원


대단해. 감사!
Neill

1
나는 그것이 목록에서 3 번째이기 때문에 이것을 거의 놓쳤다. 자체 질문을 한 다음 스스로 대답하는 것이 도움이 될 것입니다.
Robb Sadler

MVC 2,3,4 나는 이해가되지 않았다 ...하지만 더 많은 사람들이 시작으로 사용하고 그것의 부족에 대해 불평을하는 동안 - 그것은 갑자기 MVC 5 의미에서 만든 : D 일
피오트르 쿨라

이것은 내 의견으로는 받아 들일만한 대답이 될 것입니다.
Manfred

101

일반 EditorFor에 대한 클래스를 설정할 수 없습니다. 원하는 편집기를 알고 있다면 바로 사용할 수 있으며 클래스를 설정할 수 있습니다. 사용자 정의 템플릿을 만들 필요가 없습니다.

@Html.TextBoxFor(x => x.Created, new { @class = "date" }) 

5
다행스럽게도 사용자 정의 템플릿을 만들 필요가 없었습니다.
Steve Duitsman

당신은 나를 위해 많은 시간을 절약 jo!
Prashanth Benny

40

당신이 사용할 수있는:

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

(적어도 ASP.NET MVC 5에서는 그렇지 않지만 ASP.NET MVC 3에서는 어떻게 작동했는지 알 수 없습니다.)


질문 제목을 읽으십시오. 이것은 MVC3의 문제이며, 완전히 오도 된 MVC5 솔루션을 제공합니다.
Vincent

11
내가 작성한 모든 게시물을 MVC5 용으로 읽으십시오. 이것은 Google의 첫 번째 결과이므로 원하는 솔루션을 찾은 후 여기에서 공유하면 일부 사람들에게 도움이 될 수 있습니다.
przno

이것은 나를 도왔다! 감사합니다 @przno
Joakim M

29

나는 똑같은 좌절 문제를 겪었고 모든 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');
});

그것은 지금 당장 도움이되었습니다. 작은 문제가 있습니다-valueAttribute.Value가 DateTime.Parse 메소드에 전달되기 전에 비어 있거나 공백이 아닌지 확인해야합니다. 그렇지 않으면 빈 필드에서 FormatException이 발생할 위험이 있습니다.
Moo

감사. 당신은 저를 많이 도와주었습니다.
Bronzato

이것은 나에게 도움이되었지만, 당신이 이것을 구현하고 있고 필드가 유효성 검사를 수행 할 것으로 기대한다면이 논리를 적용해야합니다 : stackoverflow.com/questions/12023970/…
Aaron Newton

잘 했어,하지만 당신은 날짜 시간 아니면 그냥 날짜 제어가 나타나면 그냥 사용하여 제어 할 수 있습니다 알고 계십니까 DateTimePickerFor과 당신이 대표하는 모델의 날짜 필드 업데이트 [DataType(DataType.Date)]또는 [DataType(DataType.DateTime)]? 예를 들어 mm / dd / yyyy 양식에 .ParseFormats(new string[] { "MM/dd/yyyy" })넣거나 원하는대로 쉽게 수정할 수 있습니다. 널 (null) 인 경우 필드를 코드화하지 않고 필드가 비어있는 것으로 렌더링됩니다.
vapcguy

면도기는 인식하지 못합니다 @MyHtmlHelpers.CalenderTextBoxFor(model => model.ExpirationDate). 이것을 구현하는 방법에 대한 아이디어가 있습니까?
Mehdiway

15

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

초기 예를 기반으로 :

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

사용자 정의 템플릿에서 :

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

8
@ Html.EditorFor (x => x.Created, new {cssClass = "date"})가 작동하지 않았습니다.
Alan Macdonald

1
이것은 나를 위해 일했으며 표시된 것보다 더 나은 대답입니다. 템플릿을 사용하는 이점을 제공하면서도 jQuery 해킹없이 사용자 정의 할 수 있습니다.
채드 헤지 콕

TextBoxFor는 예를 들어 'DataType'과 같이 모델에서 설정할 수있는 다른 속성을 무시합니다.
Markus

8

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


2
@Html.EditorFor(m=>m.Created ...) 

텍스트 상자에 인수를 전달할 수 없습니다

이것이 속성을 적용 할 수있는 방법입니다.

@Html.TextBoxFor(m=>m.Created, new { @class= "date", Name ="myName", id="myId" })

2

jQuery를 사용하면 쉽게 할 수 있습니다.

$("input").addClass("class-name")

입력 태그는 다음과 같습니다

@Html.EditorFor(model => model.Name)

DropDownlist의 경우 다음을 사용할 수 있습니다.

$("select").addClass("class-name")

드롭 다운리스트의 경우 :

@Html.DropDownlistFor(model=>model.Name)

2

질문은 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) 와 같은 속성을 추가하는 데 도움이 될 수 있습니다 .


1

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 속성과 동일한 작업을 수행 할 수도 있습니다.


1

CSS 속성 선택기를 사용하여 다른 솔루션을 사용하여 필요한 것을 얻었습니다.

알고있는 HTML 속성을 표시하고 원하는 상대 스타일로 넣으십시오.

아래처럼 :

input[type="date"]
{
     width: 150px;
}

1

MVC 4 용 사용자 지정 템플릿을 만들 필요가 없습니다. EditFor 대신 TextBox 를 사용 하십시오. 특수 HTML 속성은 지원되지 않으며 MVC 5에서만 지원됩니다. TextBox는 MVC 4를 지원해야합니다. 다른 버전에 대해서는 잘 모릅니다.

@Html.TextBox("test", "", new { @id = "signupform", @class = "form-control", @role = "form",@placeholder="Name" })


0

한 페이지에 하나의 텍스트 상자 크기를 설정해야했습니다. 모델의 코딩 속성과 사용자 정의 편집기 템플릿 생성이 너무 많았으므로 텍스트 상자의 크기를 지정하는 클래스를 호출하는 span 태그로 @ Html.EditorFor 호출을 래핑했습니다.

CSS 클래스 선언 :

.SpaceAvailableSearch input
{
    width:25px;
}

코드보기 :

<span class="SpaceAvailableSearch">@Html.EditorFor(model => model.SearchForm.SpaceAvailable)</span>

0

@Html.EditorFor()MVC3 RAzor에서 클래스를 적용하는 가장 좋은 방법 은

@Html.EditorFor(x => x.Created)


<style type="text/css">

#Created
{
    background: #EEE linear-gradient(#EEE,#EEE);   
    border: 1px solid #adadad;
    width:90%;
    }
</style>

그것은 위에 스타일을 추가합니다 EditorFor()

MVC3에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.