70

編集ページでEditorForを使用してreadOnlyを作成したい。

私は読み取り専用にして無効にしようとしました:

<div class="editor-field">
        @Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
    </div>

ただし、動作しません。このフィールドの編集を無効にするにはどうすればよいですか?

ありがとうございました。

4

12 に答える 12

98

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" })
于 2012-04-11T18:13:35.807 に答える
34

このコードはMVC4以降でサポートされています

@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
于 2015-11-13T17:12:49.550 に答える
13

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);

これが誰かに役立つことを願っています。私の英語でごめんなさい

于 2013-05-17T16:14:19.423 に答える
6

あなたはこのようにそれを行うことができます:

@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
于 2016-08-31T07:02:21.430 に答える
5

質問にMVC3と記載されていることは知っていますが、念のために2012年でした。

MVC 5.1以降、HTML属性をEditorFor次のように渡すことができるようになりました。

@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
于 2016-04-13T23:35:39.993 に答える
4

使用してみてください:

@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
于 2016-05-04T10:22:22.927 に答える
3

これが私がそれをする方法です:

モデル:

[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そうでない場合のaの追加、aの追加、ValidateMessageFor最後に割り当てDiv可能なaでのすべてのラップなど、さらに多くのことを行っています。Html Attributesそれに...私Viewsはとてもきれいです。

于 2013-11-04T23:45:08.610 に答える
1

特定のビューのセット(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; }
于 2013-08-05T17:12:27.967 に答える
1

私が知っている古い投稿..しかし今、あなたはこれを行うことができ、整列とすべての見た目の一貫性を保つことができます。

 @Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
于 2016-10-05T16:11:20.483 に答える
1

readonly属性の代わりに属性を使用しdisabledます。これは、フィールドが読み取り専用の場合でも値を送信するためです。

:読み取り専用属性が存在すると、readonlyfalseに設定されていてもフィールドが作成されるため、以下のようなコード用にエディターを分岐するのはなぜですか。

 @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" } })
 }
于 2019-04-06T11:32:05.810 に答える
0
<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

jqueryを使用して無効にします

<script type="text/javascript">
   $(document).ready(function () {
      $('#userName').attr('disabled', true);
     });
</script>
于 2014-08-20T19:32:42.883 に答える
-1

[Editable(false)]属性を使用することで、これは他よりも簡単だと思います

例えば:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }
于 2014-01-17T09:01:02.567 に答える