ASP.NET MVC3 Razor에서 읽기 전용 텍스트 상자를 만드는 방법 방법은 무엇입니까? 이를 수행 할 수있는 HTMLHelper

Razor보기 엔진을 사용하여 ASP.NET MVC3에서 읽기 전용 텍스트 상자를 만드는 방법은 무엇입니까?

이를 수행 할 수있는 HTMLHelper 메서드가 있습니까?

다음과 같은 것?

@Html.ReadOnlyTextBoxFor(m => m.userCode)


답변

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

이를 위해 HTML Helper를 만들 수 있지만 이것은 단순히 다른 것과 마찬가지로 HTML 속성 일뿐입니다. 다른 속성을 가진 텍스트 상자에 대한 HTML 도우미를 만드시겠습니까?


답변

업데이트 :
이제 기본 편집기 템플릿에 HTML 속성을 추가하는 것은 매우 간단합니다. 다음을 수행하는 대신 필요합니다.

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

간단히 이렇게 할 수 있습니다.

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

이점 : .TextBoxFor템플릿을 위해 등 을 호출 할 필요가 없습니다 . 전화 만하세요 .EditorFor.


@Shark의 솔루션이 올바르게 작동하고 간단하고 유용하지만 내 솔루션 (항상 사용하는)은 다음과 같습니다. Create an editor-templatethat can handle the readonlyattribute :

  1. EditorTemplates에서 이름이 지정된 폴더 만들기~/Views/Shared/
  2. PartialView명명 된 면도기 만들기String.cshtml
  3. 채우기 String.cshtml이 코드 :

    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" })
    }
  4. 모델 클래스에서 [ReadOnly(true)]원하는 속성에 속성을 입력하십시오 readonly.

예를 들면

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

이제 Razor의 기본 구문을 간단히 사용할 수 있습니다.

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

첫 번째 text-box는 다음과 같은 법선을 렌더링합니다 .

<input class="text-box single-line" id="field-id" name="field-name" />

그리고 두 번째는 렌더링됩니다.

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

당신은 모든 유형의 데이터에 대해이 솔루션을 사용할 수 있습니다 ( DateTime, DateTimeOffset, DataType.Text, DataType.MultilineText등). 그냥를 작성 editor-template.


답변

TextBoxFor를 사용한 솔루션은 괜찮지 만 EditBox stylish (사용자에게 약간 혼란 스러울 수 있음) 과 같은 필드를 보지 않으려면 다음과 같이 변경해야합니다.

  1. 변경 전 Razor 코드

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
  2. 변경 후

    <!-- New div display-field (after div editor-label) -->
    <div class="display-field">
        @Html.DisplayFor(model => model.Text)
    </div>
    
    <div class="editor-field">
        <!-- change to HiddenFor in existing div editor-field -->
        @Html.HiddenFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>

일반적으로이 솔루션은 필드 편집을 방지하지만 그 가치를 보여줍니다. 코드 숨김 수정이 필요하지 않습니다.


답변

@Bronek 및 @Shimmy의 이전 답변에 대한 크레딧 :

이것은 ASP.NET Core에서 동일한 작업을 수행 한 것과 같습니다.

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

첫 번째 입력은 읽기 전용이고 두 번째 입력은 컨트롤러에 값을 전달하고 숨겨집니다. ASP.NET Core로 작업하는 사람에게 유용하기를 바랍니다.


답변

 @Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })

답변

@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

이것은 텍스트 상자에 적합합니다. 그러나 동일한 작업을 수행 checkbox하려는 경우 사용하는 경우 다음을 사용하십시오.

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

그러나 사용하지 마십시오. disabledisable은 항상 서버에 기본값을 전송하므로 false선택 또는 선택 취소 상태였습니다. 그리고 readonly확인란 및 radio button. 필드 readonly에서만 작동 text합니다.


답변

아래 코드를 사용하여 TextBox를 읽기 전용으로 만들 수 있습니다.

방법 1

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

방법 2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})