asp.net MVC 미리보기가있는 html.textbox 조건부 속성 5
-
05-07-2019 - |
문제
사용자가 클라이언트 항목을 작성하고 편집 할 수있는 UI를 담당하는 강력한 MVC보기 컨트롤이 있습니다. 나는 그들이 정의 할 수 있기를 원합니다 ClientId
창조시, 그러나 편집하지는 않지만 이것은 UI에 반영됩니다.
이를 위해 다음 줄이 있습니다.
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new
{ @readonly =
(ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? "readonly" : "false")
} )
%>
내가 어떤 값을 부여 적 속성 ( "false"및 "" ")에게 제공하더라도 Firefox와 IE7은 입력 읽기 전용을 만듭니다. 이는 성가신 반 직관적입니다. 필요하지 않은 경우 속성을 완전히 삭제할 수있는 3 대리 운영자 기반 방법이 있습니까?
해결책
힘든 문제 ... 그러나 당신이 readonly
속성, 당신은 다음과 같이 할 수 있습니다.
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId,
ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? new { @readonly = "readonly" }
: null)
%>
더 많은 속성을 정의하려면 두 가지 익명 유형을 정의하고 속성의 여러 사본을 가져야합니다. 예를 들어, 이와 같은 것 (어쨌든 마음에 들지 않음) :
ClientId.Length > 0
? (object)new { @readonly = "readonly", @class = "myCSS" }
: (object)new { @class = "myCSS" }
다른 팁
몇 가지 속성을 정의하려면 조건부가 재조정합니다. 다른 속성을 복제하지 않고, 속성에 익명 유형 대신 사전을 사용할 수 있습니다.
예를 들어
Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "myCSS");
htmlAttributes.Add("data-attr1", "val1");
htmlAttributes.Add("data-attr2", "val2");
if (Model.LoggedInData.IsAdmin == false)
{
htmlAttributes.Add("readonly", "readonly");
}
@:User: @Html.TextBoxFor(
m => m.User,
htmlAttributes)
그리고 대안은 그것을 평범한 오래된 HTML로 방출하는 것입니다. 그렇습니다. 편집자는 당신이 당신이 틀렸다고 생각하게 만들 것입니다. 그러나 그것은 vs2008sp1에서 상당히 자주 발생하는 것 같습니다. 이 예제는 CTP5에서 완전히 낭비되는 것으로 보이는 확인란의 경우에 특히 조건부 속성을 방출하는 방법을 제공합니다.
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
팁 : 브라우저에서 요소를 읽거나 비활성화하는 Readonly/Disabled 속성의 존재만으로도 단순한 존재입니다.
@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
나는 그것이되어야한다고 생각합니다
<%= ((bool) Eval("InRole")) ? "checked" : "" %>
나병에 대신에 대답하십시오.
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
적어도 그것은 #와 함께 작동하지 않았지만 =에서 작동했습니다. 내가 잘못 했어? 어쨌든 팁에 감사드립니다 :)
나는 이것을 사용한다 :
@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
나는 위의 대부분의 제안을 시도했고 이제는 한 줄로 가장 간단한 곳에 도착했습니다. 두 가지 익명의 HTML 속성 객체를 "개체"유형으로 선언하여 객체를 결합하십시오.
@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)