30

ユーザーがクライアント項目を作成および編集できる UI を担当する、厳密に型指定された MVC ビュー コントロールがあります。ClientId作成時は定義できるが編集はできないようにして、UI に反映できるようにしてほしいです。

この目的のために、次の行があります。

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
 { @readonly = 
   (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
      ? "readonly" : "false") 
 } )
%>

readonly 属性にどのような値を指定しても ("false" や "" であっても)、Firefox と IE7 は入力を読み取り専用にするようです。属性が必要ない場合、属性を完全に削除するための、三項演算子ベースの優れた方法はありますか?

4

8 に答える 8

37

難しい問題です...しかし、属性だけを定義したい場合は、次のreadonlyようにすることができます:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
  ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly =  "readonly" } 
    : null) 
%>

さらに属性を定義する場合は、2 つの匿名型を定義し、属性のコピーを複数持つ必要があります。たとえば、次のようなものです(とにかく好きではありません):

ClientId.Length > 0 
  ? (object)new { @readonly = "readonly", @class = "myCSS" } 
  : (object)new { @class = "myCSS" }
于 2008-10-07T11:29:53.753 に答える
31

複数の属性を定義し、他の属性を複製せずに条件付き読み取り専用にする場合は、属性に匿名型の代わりにディクショナリを使用できます。

例えば

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)  
于 2012-12-11T09:44:29.230 に答える
4

また、代わりに、プレーンな古い HTML として出力することもできます。はい、エディターはあなたが間違っていると思わせるでしょうが、それは VS2008SP1 ではかなり頻繁に起こるようです。この例は、特に CTP5 では完全に無駄になっているように見えるチェックボックス用ですが、条件付き属性を発行する方法についてのアイデアを提供します。

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
于 2008-10-07T11:37:32.583 に答える
1

そうあるべきだと思う

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 

これの代わりにレピーの答え。

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

少なくとも # ではうまくいきませんでしたが、= ではうまくいきました。私は何か悪いことをしましたか?とにかくヒントをありがとう:)

于 2008-12-04T10:38:49.933 に答える
0
$(function() { $("[readonly='false']").removeAttr("readonly"); });
于 2010-08-09T19:31:36.450 に答える