0

@ Html.EnumDropDownListForを使用したいと思います。問題が発生しています。EnumDropDownListForでオブジェクトのプロパティにバインド

これは私が持っているものです。

@Html.EnumDropDownListFor(x => x.DefaultProviderEnum, 
       "Select default provider", new { @class = "form-control", id = "pro" }) 

DefaultProviderEnumはタイプProviderFormatは次のとおりです。

public enum ProviderFormat 
{ 
    [Description("ASG")] 
    ASG = 1, 
    [Description("SCS")] 
    SCS = 2 
} 

そして、私はモデルでそれを正しく設定し、それをロードしたときに、それが正しく表示されます。列挙型をバインドする方法はあり

model.CU.DefaultProviderInt = (int)model.DefaultProviderEnum; 

:私が持っている問題は、私はそれを投稿したときに、私は手動でそれがint型である私のオブジェクト、上のプロパティにバインドするのではなく、私のオブジェクトにそれを設定する必要がありますオブジェクトのプロパティにドロップし、このように設定する必要はありませんか?

+0

'model.CU.DefaultProvider'とは何ですか?あなたはプロパティが 'ProviderFormat'型であり、後でそれが' int'型であると言っていますか?あなたは 'CU.DefaultProvider'が何をしているかを省略しました。 – adiga

+0

DefaultProviderは、CUオブジェクト上の単なるintです。私はDefaultProviderを 'ProviderFormat'型のモデルから外して設定しようとしています。 –

答えて

1

model.CUオブジェクトは、値がフォームの提出に提供されているものは何でもしてModeBinderによって(がバインドさ?)バインドされます。

だから、あなたの形で、あなたはこのような隠された性質を持つことができます。

@Html.HiddenFor(x => x.CU.DefaultProviderInt, new { id = "cu-default-provider" }) 

その後DefaultProviderEnumドロップダウンにchangeイベントハンドラを追加し、select値を非表示入力の値を設定します。

$(function() { 
    $("#DefaultProviderEnum").change(function(){ 
     $("#cu-default-provider").val($(this).val()); 
    }) 
}); 

フォームが送信されると、両方のプロパティの値が同じになります。


これを行う別の方法があります。 DefaultProviderEnumの値を手動でコードのどこかに設定すると、上記のコードは機能しません。だから、あなたがDefaultProviderEnumプロパティのカスタムセッター持つことができます。

private ProviderFormat defaultProviderEnum; 

public ProviderFormat DefaultProviderEnum 
{ 
    get { return defaultProviderEnum; } 
    set 
    { 
     if (this.CU != null) 
     { 
      this.CU.DefaultProviderInt = (int)value; 
     } 

     defaultProviderEnum = value; 
    } 
} 

をしかし、これはまたDefaultModelBinderプロパティをバインドする順序に依存する場合があります。


第三(DefaultProviderEnumが設定されているときCUがnullの場合、これがそうモデルのコンストラクタでCUを初期化することを確認してください。動作しない場合があります)と、これを行うための最善の方法がある手動でキャストしますenumをintに設定してCU.DefaultProviderIntに設定します。

1

あなたは何を持っていますか?フィールドがDefaultProviderEnumにバインドされている場合は、それがモデルバインダーによって設定される唯一のものです。そのため、それに基づいて別のプロパティを設定するために手動による介入が必要になります。モデルバインダーに投稿された1つの値に基づいて2つのプロパティを設定する方法はありません。もしそれがあなたが吠えているツリーならば。

しかし、あなたは、単にのような性質持つことができます。そして、

public int DefaultProviderInt => (int)DefaultProviderEnum; 

を、それは常にちょうどその瞬間であることを起こるものは何でも列挙型の値のint型の強制を返します。

+0

私はドロップダウンを持つために、ヘルパーを使って列挙型を設定したツリーを樹立しようとしていましたが、int型のオブジェクトにプロパティを設定しています。既定のプロバイダープロパティをintからProviderFormat列挙型に変更するだけで、このヘルパーを使用して設定するプロパティとしてintを使用する方法があるかどうかを知りたいと思っています。 –

+0

いいえ、列挙型を転記している場合は、列挙型にバインドする必要があります。 –

関連する問題