1

Razor で ASP.NET MVC3 を使用しています。

ビューでチェック ボックスとしてレンダリングしたいモデルにブール値があります。ただし、ブール状態の逆を示すチェックボックスが必要です。つまり、チェック ボックスをオンにすると、フォームが送信されたときに、バインドされたモデル オブジェクトが true ではなく false に設定されます。およびその逆。

これを行うと、レンダリングされたチェック ボックスの入力要素に value 属性を設定できます。

@Html.CheckBoxFor(model => model.MyBoolean, new { value = "false" })

ただし、自動的に作成される非表示の入力要素の値は false のままです。つまり、バインドされたモデル オブジェクトは常に false に設定されます。

では、HTML ヘルパーに隠し要素を true に、チェック ボックス要素を false に設定させるにはどうすればよいでしょうか?

(a) モデルとデータベースを変更できること、(b) 送信の直前に JavaScript で値を変更できること、(c) 送信後にコントローラーで受け取った値を交換できることを知っています。私はこれらのいずれかを行うかもしれませんが、可能な解決策を求めているわけではありません。HTML ヘルパーを希望どおりに動作させることができるかどうかを尋ねています。私は広範囲に検索しましたが、これが公式または非公式の情報源のどこにも対処されているのを見たことはありません. 「スワップ」オプションか何かが必要なようです。

4

3 に答える 3

3
    class ViewModel {
        public bool MyBoolean {get;set;}
        public bool DisplayValue {
            get {
                return ! MyBoolean ;
            }

            set {
                MyBoolean = !value;
            }
        }
    }

とにかくDisplayValue、セッターがプロパティを更新するので、にバインドします。MyBoolean

編集:

あなたの質問をもう一度読んだ後:。

HtmlHelperを使用してこれを行うことができますが、CheckBoxを使用する代わりに、ドロップダウンを使用できます。ドロップダウンは、「最適な」値とテキストを定義します。

    myModelInstance.PossibleValues = new[] { new SelectListItem { Value = "false", Text = "Not false" }, new SelectListItem { Value = "true", Text = "Not true" } };

説明が、モデルの目的とは逆の意味であることに注意してください。だから例えば。trueの場合、テキストは「Hidden」、falseの場合は「Visible」、trueの場合は「Disabled」、falseの場合は「Enabled」などになります。

次に、あなたの見解で:

    @Html.DropDownList(Model.MyBoolean.ToString(), Model.PossibleValues)

モデルは、表示または更新する前にブールトグルを実行しなくても、正しい値で更新されます。

于 2013-01-17T19:39:13.597 に答える
0

将来の読者のために、私自身の意見では、HtmlHelpers は Html をレンダリングするように設計されています (名前が示すように)。アイテムをレンダリングする別の方法を作成するための私の好みは、EditFor および DisplayFor テンプレートを作成することです。これが高度に再利用可能であることを確認するために、これらのテンプレート用に特別に設計されたモデルも作成します。あなたのデザインでは、私のモデルとテンプレートは次のようになります。

/Models/Controller/ControllerActionViewModel.cs

public class ControllerActionViewModel
{
  public ControllerActionViewModel()
  {
    this.CheckboxBoolTemplate = new CheckboxBoolTemplate(false, true);
  }

  [Display(Name = "My Boolean")]
  public SelectBoolTemplate MyBoolean { get; set; }
}

/TemplateModels/ControllerActionViewModel.cs

public sealed class SelectBoolTemplate
{
  private bool _valuesSwapped = false;
  private bool? _value;
  private bool _defaultValue = false;

  public SelectBoolTemplate()
  {
  }

  public SelectBoolTemplate(bool valuesSwapped)
  {
    this._valuesSwapped = valuesSwapped)
  }

  public SelectBoolTemplate(bool defaultValue, bool valuesSwapped)
  {
    this._defaultValue = defaultValue;
    this._valuesSwapped = valuesSwapped)
  }

  public bool Value
  {
    get
    {
      if (this._value.HasValue)
      {
        return this._value.Value
      }
      return this._defaultValue;
    }
    set
    {
      this._value = value;
    }
  }
}

/Views/Shared/EditorTemplates/SelectBoolTemplate.cshtml

@model SelectBoolTemplate

@{
string propertyName = ViewContext.ViewData.ModelMetadata.PropertyName;
string fullPropertyName = ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
string labelText = ViewContext.ViewData.ModelMetadata.DisplayName 
                   ?? ViewContext.ViewData.ModelMetadata.PropertyName;
}

@Html.LabelForModel()
@Html.Checkbox(fullPropertyName, Model.Value)
于 2013-01-18T19:01:05.523 に答える