45

定義しているテキストボックスがあります

<%= Html.TextBox("Username", Model.Form.Username, 
        new { @class = "textbox", @disabled = "disabled" })%>

アクションは次のように定義されます

    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult EditLogin(LoginForm post) {

        ...

        return View(model);
    }

これにPOSTすると、Username空白になります。他のすべてのプロパティは正しくバインドされますが、ユーザー名に変更@disabled="disabled"すると正しくバインドされ、すべてが機能します。@readonly="readonly"

モデルバインディングは無効なフィールドの値を無視しているようです。これを回避する方法はありますか?モデルにバインドするには、フィールドの値が必要です。読み取り専用を使用できますが、フィールドの値を編集できないことがユーザーに視覚的にわかるように、無効を使用することをお勧めします。

4

7 に答える 7

67

無効になっているフォームフィールドは何も送信しないと思います。フォームがあり、そのフォームのfooフィールドを無効にすると、投稿時にfooフィールドの値がなくなります。これは単にHTMLのフィールドを無効にする性質であり、MVCの問題ではありません。

于 2010-04-16T14:24:52.440 に答える
60

使用readonly-入力を無効にしますが、バインディングには引き続き入力されます。divにスタイルを適用して、グレー表示に見えるようにすることはできますか?

<div class="editor-label">
  @Html.LabelFor(model => model.FileName)
</div>
<div class="editor-field-greyed-out">
  @Html.TextBoxFor(model => model.FileName, new { @readonly = true })
  @Html.ValidationMessageFor(model => model.FileName)
</div>
于 2012-03-23T13:42:00.017 に答える
5

値を送り返したいが編集できない場合は、値を非表示フィールドに配置することを検討してください。明らかに、ユーザーが改ざんする可能性があるため、ある程度のセキュリティが必要な場合はこれを行わないでください。

于 2010-04-16T14:30:51.217 に答える
4

同じ値の非表示フィールドを追加することで回避策を実行できます;)

<%= Html.Hidden("Username", Model.Form.Username)%>
于 2013-06-18T19:30:42.493 に答える
4

コメントで示唆されているように、無効ではなく読み取り専用をオプションにすることもできますが、選択したボックスでは機能しません。非表示の入力を作成する代わりに、入力または選択を無効のままにして、送信時にJavaScriptを使用してdisabledプロパティを変更することでデータを渡すことができます。

jQueryを使用すると、次のようになります。

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});
于 2017-06-15T15:16:35.720 に答える
1

無効になっているフィールドを送信する最も簡単な方法は、送信する前に、フィールドを非表示の無効になっていないコントロールにコピーすることです。これらのコントロールを手動で作成し、jQueryのon changeイベントに接続してオンデマンドでコピーする人もいますが、以下のソリューションは一般的で簡単でおしゃべりではありません-1つのルール:ポストバック後にクリーンなページを作成(レンダリング)する必要があります(それで

$('#submitBtn').closest('form').one('submit', function() {

    var $form = $(this);

    // input, textarea, select, option, ----- button, datalist, keygen, output, optgroup
    $form.find('input:disabled, textarea:disabled, select:disabled, option:disabled').each(function () {

        var $item = $(this);

        var hiddenItem = $item.clone();
        hiddenItem.removeAttr('id');
        hiddenItem.removeAttr('disabled');
        hiddenItem.attr('style', 'display: none');

        $item.after(hiddenItem);
    });

});
于 2016-05-18T05:10:03.840 に答える
0

@readonly=trueは私のページでは機能しません。私は追加の調査を行いました。これがそれを説明する記事です

ReadOnly属性はASP.NETMVCモデルでは機能しません

于 2017-02-09T22:27:39.667 に答える