0

オプションのパラメーターをいくつか取るアクション メソッドがあります。

この ASP.NET MVC アクションメソッドは単純に見えますが、思い通りに動作しません....

[HttpPost]
public ActionResult UpdateOrder(OrderItem OrderItem, Address ShippingAddress)
{
     if (ShippingAddress != null) {
         // we have a shipping address
     }
}

Addressオブジェクトは常に作成されます。これはShippingAddress、モデル バインダーが機能する方法だからです。などのフィールドがフォームに存在しない場合でもShippingAddress.Address1ShippingAddress.Cityオブジェクトが作成されてアクションに渡されます。

モデルが空であると見なされた場合にモデルに対して null を返すモデル バインダーを作成する方法が必要です。

最初の試行は次のようになります

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    base.OnModelUpdated(controllerContext, bindingContext);

    // get the address to validate
    var address = (Address)bindingContext.Model;

    // if the address is quintessentially null then return null for the model binder
    if (address.Address1 == null && address.CountryCode == null && address.City == null)
    {
        bindingContext.Model = null;
    }
 }

残念ながら、この単純な解決策は機能せず、次のエラーが発生します。

InvalidOperationException - このプロパティ セッターは廃止されました。その値は現在 ModelMetadata.Model から派生しているためです。

カスタム ModelBinder から「モデル」全体を作成して null を返す方法はありますか?

4

1 に答える 1

0

デフォルトのパラメータをに設定してみましたnullか?タイプをnull許容に設定する必要があるかもしれませんが、それが必要かどうかは100%わかりませんが、それが私が使用する方法です。

例えば:

public ActionResult UpdateOrder(OrderItem OrderItem, Address? shippingAddress = null)

これには.NET4が必要ですが、実行しているバージョンを指定しなかったことに注意してください。

于 2010-11-03T13:35:27.410 に答える