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-template
that can handle the readonly
attribute :
EditorTemplates
에서 이름이 지정된 폴더 만들기~/Views/Shared/
PartialView
명명 된 면도기 만들기String.cshtml
-
채우기
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" }) }
-
모델 클래스에서
[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 (사용자에게 약간 혼란 스러울 수 있음) 과 같은 필드를 보지 않으려면 다음과 같이 변경해야합니다.
-
변경 전 Razor 코드
<div class="editor-field"> @Html.EditorFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text) </div>
-
변경 후
<!-- 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" })
그러나 사용하지 마십시오. disable
disable은 항상 서버에 기본값을 전송하므로 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"}})