オプションのパラメーターをいくつか取るアクション メソッドがあります。
この ASP.NET MVC アクションメソッドは単純に見えますが、思い通りに動作しません....
[HttpPost]
public ActionResult UpdateOrder(OrderItem OrderItem, Address ShippingAddress)
{
if (ShippingAddress != null) {
// we have a shipping address
}
}
Address
オブジェクトは常に作成されます。これはShippingAddress
、モデル バインダーが機能する方法だからです。などのフィールドがフォームに存在しない場合でもShippingAddress.Address1
、ShippingAddress.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 を返す方法はありますか?