編集ページでEditorForでreadOnlyを作成したい。
私は読み取り専用にして無効にしようとしました:
<div class="editor-field">
@Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
</div>
ただし、機能しません。このフィールドの編集を無効にするにはどうすればよいですか?
ありがとうございました。
EditorFor htmlヘルパーには、HTML属性を取るオーバーロードがありません。この場合、TextBoxForのようなより具体的なものを使用する必要があります。
<div class="editor-field">
@Html.TextBoxFor(model => model.userName, new
{ disabled = "disabled", @readonly = "readonly" })
</div>
EditorForは引き続き使用できますが、カスタムEditorTemplateにTextBoxForが必要です。
public class MyModel
{
[UIHint("userName")]
public string userName { ;get; set; }
}
次に、Views/Shared/EditorTemplatesフォルダーで、userName.cshtmlファイルを作成します。そのファイルに、これを入れてください:
@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })
このコードはMVC4以降でサポートされています
@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
EditoForを編集可能にしたくないのに、なぜEditoForを使用したいのか疑問に思う人のために、例を示します。
私のモデルにはこれがあります。
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0: dd/MM/yyyy}")]
public DateTime issueDate { get; set; }
そして、あなたがそのフォーマットを表示したいとき、それはEditorForを使用する唯一の方法ですが、私はその「入力」用のjquery datepickerを持っているので、間違った日付を書き留めるユーザーを避けるために読み取り専用にする必要があります。
私が望むように機能させるには、これをビューに入れます...
@Html.EditorFor(m => m.issueDate, new{ @class="inp", @style="width:200px", @MaxLength = "200"})
そして、これは私の準備機能で...
$('#issueDate').prop('readOnly', true);
私はこれが誰かに役立つことを願っています。私の英語でごめんなさい
次の方法で実行できます。
@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
私は質問がMVC 3を示していることを知っていますが、それは2012年でしたので、念のために:
MVC 5.1以降、次のようにEditorFor
にHTML属性を渡すことができます。
@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
以下にその方法を示します。
モデル:
[ReadOnly(true)]
public string Email { get { return DbUser.Email; } }
表示:
@Html.TheEditorFor(x => x.Email)
拡張子:
namespace System.Web.Mvc
{
public static class CustomExtensions
{
public static MvcHtmlString TheEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
return iEREditorForInternal(htmlHelper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
private static MvcHtmlString iEREditorForInternal<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
{
if (htmlAttributes == null) htmlAttributes = new Dictionary<string, object>();
TagBuilder builder = new TagBuilder("div");
builder.MergeAttributes(htmlAttributes);
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
string labelHtml = labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression).ToHtmlString();
if (metadata.IsRequired)
labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression, new { @class = "required" }).ToHtmlString();
string editorHtml = Html.EditorExtensions.EditorFor(htmlHelper, expression).ToHtmlString();
if (metadata.IsReadOnly)
editorHtml = Html.DisplayExtensions.DisplayFor(htmlHelper, expression).ToHtmlString();
string validationHtml = Html.ValidationExtensions.ValidationMessageFor(htmlHelper, expression).ToHtmlString();
builder.InnerHtml = labelHtml + editorHtml + validationHtml;
return new MvcHtmlString(builder.ToString(TagRenderMode.Normal));
}
}
}
もちろん、私のエディターは、ラベルを追加したり、必要に応じてそのラベルに必要なクラスを追加したり、プロパティがDisplayFor
ReadOnly
である場合はEditorFor
を追加したり、 、ValidateMessageFor
を追加し、最後にHtml Attributes
を割り当てることができるDiv
にすべてをラップします... Views
は非常にきれいです。
使用してみてください:
@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
私が知っている古い投稿..しかし、あなたはこれを行うことができます。
@Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
特定のビューのセット(1つのコントローラーにバインド)のEditorTemplateを作成します。
この例では、日付のテンプレートがありますが、必要に応じて変更できます。
Data.cshtmlのコードは次のとおりです。
@model Nullable<DateTime>
@Html.TextBox("", @Model != null ? String.Format("{0:d}", ((System.DateTime)Model).ToShortDateString()) : "", new { @class = "datefield", type = "date", disabled = "disabled" @readonly = "readonly" })
モデル内:
[DataType(DataType.Date)]
public DateTime? BlahDate { get; set; }
readonly
属性の代わりにdisabled
属性を使用します。これは、フィールドが読み取り専用の場合でも値を送信するためです。
注:readonly属性が存在すると、falseに設定されていてもフィールドreadonly
になります。そのため、以下のようなコードでエディターを分岐させる理由を説明します。
@if (disabled)
{
@Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control", @readonly = "" } })
}
else
{
@Html.EditorFor(model => contact.EmailAddress, new { htmlAttributes = new { @class = "form-control" } })
}