mvc3의 razor에서 LabelFor의 표시 이름을 변경하는 방법은 무엇입니까?


87

면도기 엔진에서는 LabelFor도우미 메서드를 사용 하여 이름을 표시했습니다.

그러나 표시 이름은 표시하기에 좋지 않은 것 같습니다. 그래서 내 표시 이름을 변경해야합니다.

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

이것은 매우 오래된 질문이지만 여전히 현재 MVC 코딩과 관련이 있습니다. 지금까지 제공된 두 가지 솔루션에 문제가 있으므로 사용할 수있는 가지 옵션 을 모두 포함하는보다 자세한 답변을 추가했습니다 .
Gone Coding

답변:


160

속성을 사용하여 뷰 모델 속성을 장식 [DisplayName]하고 사용할 텍스트를 지정할 수 있습니다.

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

또는 텍스트를 지정할 수있는 LabelFor 도우미의 다른 오버로드를 사용합니다.

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

그리고 아니요, LabelFor도우미가 지원하지 않으므로 MVC3에서 클래스 이름을 지정할 수 없습니다 . 그러나 이것은 MVC4 또는 5에서 작동합니다.


@ raj2sekar1, 작동 중이고이 답변이 문제를 해결하는 데 도움이 되었으면 옆에있는 체크 표시를 클릭하여 답변으로 표시하는 것을 고려해야합니다. meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
그래도 System.ComponentModel을 사용해야합니다.
yancyn

2
유용했습니다. 감사합니다. 하지만 난 당신이 대신이 있다면 당신의 대답은 더 좋을 거라 생각@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
아마도 이것은 얼마 전에 작성되었지만 이제는 LabelFor 내부에 클래스 이름을 지정할 수 있습니다. 예 : @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
그러나 데이터베이스를 업데이트하면 모델 클래스가 다시 생성되고이를 잃게됩니다. 그것을 어떻게 피합니까?
shim

30

이것은 오래된 질문 이었지만 기존 답변은 모델을 다시 생성 할 때 사용자 지정 속성을 버리는 심각한 문제를 무시합니다. 현재 사용 가능한 옵션을 다루기 위해 더 자세한 답변을 추가하고 있습니다.

세 가지 옵션이 있습니다.

  • [DisplayName("Name goes here")]데이터 모델 클래스에 속성을 추가하십시오 . 단점은 데이터 모델을 재생성 할 때마다 버려진다는 것입니다.
  • 문자열 매개 변수를 Html.LabelFor. 예를 들어 @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})참조 : https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx 단점은 레이블을 반복해야한다는 것입니다. 모든 관점에서.
  • 세 번째 옵션입니다. 데이터 클래스에 연결된 메타 데이터 클래스를 사용합니다 (세부 사항은 다음 참조).

옵션 3-메타 데이터 클래스 추가 :

Microsoft는 기존 클래스를 수정하지 않고도 Entity Framework 클래스의 속성을 장식 할 수 있습니다 ! 이는 데이터베이스 클래스에 연결되는 메타 데이터 클래스 (효과적으로 EF 클래스의 측면 확장)를 가짐으로써 가능합니다. 이렇게하면 데이터 모델을 재생성 할 때 변경 사항이 손실되지 않도록 클래스 자체가 아닌 관련 클래스에 속성을 추가 할 수 있습니다 .

예를 들어 데이터 클래스 MyModelSomekingStatus속성이있는 경우 다음과 같이 할 수 있습니다.

먼저 동일한 이름 의 부분 클래스 를 선언하고 (동일한 네임 스페이스를 사용하여) 재정의하지 않고 클래스 속성을 추가 할 수 있습니다.

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

생성 된 모든 데이터 모델 클래스는 부분 클래스이므로 동일한 이름의 클래스를 더 많이 생성하여 추가 속성 및 메서드를 추가 할 수 있습니다 (매우 편리하며 모델에서 다른 필드 유형의 형식화 된 문자열 버전을 제공하는 데 자주 사용합니다. ).

2 단계 : 새 partial 클래스에서 참조하는 메타 데이터 클래스를 추가합니다.

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

참조 : https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

메모:

  • 메모리에서 메타 데이터 클래스를 사용하기 시작하면 실제 클래스 ( [required]등) 의 기존 속성을 무시할 수 있으므로 메타 데이터 클래스에서 복제해야 할 수 있습니다.
  • 이것은 마법으로 작동하지 않으며 어떤 클래스에서도 작동하지 않습니다. UI 데코레이션 속성을 찾는 코드는 먼저 메타 데이터 클래스를 찾도록 설계되었습니다.

이것이 ASP.NET Core 3.1에서 작동하지 않는 이유가 있습니까? [필수] 작동하지만 [DisplayName ( "my label")은 작동하지 않음]
John Pasquet

15

속성을 속성으로 장식하여 레이블의 텍스트를 변경할 수 있습니다 DisplayName.

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

또는 원시 HTML을 명시 적으로 작성할 수 있습니다.

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim : 뷰에서 데이터베이스 / 도메인 모델 클래스로 직접 작업해서는 안됩니다. 일반적으로 중간에 중간 '뷰 모델'클래스가 있습니다.
Vman 2015 년

내가 라벨 구문을 사용하여 찾고 있던 것을 정확히 .. @xander 감사합니다
Asif Iqbal

1
"원시 HTML을 명시 적으로 작성"의 문제는 해당 양식을 사용할 때마다 레이블을 직접 작성해야한다는 것입니다. 모델에 de DisplayName을 선언하는 것이 좋습니다.
César León

4

DisplayName 특성을 사용하여 모델 속성을 장식합니다.


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