web-dev-qa-db-ja.com

無効なテキストボックスを使用したモデルのバインド

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

<%= 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 "に変更すると、ユーザー名は適切にバインドされ、すべてが機能します。

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

40
modernzombie

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

60
John Hartsock

use 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>
51
vincemcc79

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

5
Dan Diplo

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

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

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});
4
tony.leo

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

<%= Html.Hidden("Username", Model.Form.Username)%>
4
Khaled Musaied

無効化されたフィールドを送信する最も簡単な方法は、送信前にそれらを非表示の無効化されていないコントロールにコピーすることです。これらのコントロールを手動で作成し、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);
    });

});
1
baHI

@readonly = trueは私のページでは機能しません。私は追加の研究をしました。ここにそれを説明する記事があります

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

0
user12345