web-dev-qa-db-ja.com

ASP.NET MVCプレビュー5のHtml.TextBox条件付き属性

ユーザーがクライアントアイテムを作成および編集できる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は入力を読み取り専用にするため、不快なことに直感に反しています。それが必要ない場合に属性を完全に削除するための素晴らしい、三項演算子ベースの方法はありますか?

29
tags2k

難しい問題...しかし、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" }
37
Panos

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

例えば.

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)  
27
Aviko

そして、代わりにそれをプレーンな古いHTMLとして出力するだけです。はい、エディターはあなたを間違っていると思わせますが、VS2008SP1ではかなり頻繁に発生するようです。この例は、CTP5では完全に無駄になっていると思われるチェックボックスを対象としていますが、条件付き属性を出力する方法を示しています。

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
4
leppie

ヒント:これは、ブラウザーで要素を読み取り専用または無効にするreadonly/disabled属性の単なる存在です。

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
4
pranavn

そうだと思う

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

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

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

少なくとも、#では機能しませんでしたが、=では機能しました。私は何か間違ったことをしましたか?とにかく先端をありがとう:)

1
Olaj

$(function(){$( "[readonly = 'false']")。removeAttr( "readonly");});

0
silversumo

私はこれを使います:

   @Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
0