MEF コンテナーからインターフェイスの実装をプルするカスタム モデル バインダーがあります。次のように実装されます。
public class PetViewModelBinder : DefaultModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var petId = bindingContext.ValueProvider.GetValue("id");
var container = controllerContext.HttpContext.Application[MvcApplication.PLUGINS] as CompositionContainer;
Lazy<IPet, IPetMetadata> pet = null;
try
{
pet = container.GetExport(typeof(IPet), petId);
var petVM = new Models.PetViewModel(pet);
bindingContext.ModelMetadata.Model = petVM;
return base.BindModel(controllerContext, bindingContext);
}
catch (Exception)
{
throw;
}
finally
{
container.ReleaseExport(pet);
}
}
これは、MEF が petId のエクスポートを持っている場合はうまく機能しますが、エクスポートが存在しない場合は http ステータス 500 (サーバー エラー) を返します。エラー メッセージの難読化要件により、http ステータス 403 (禁止) が返される必要があります。
エラーをトラップし、応答ステータスを変更し、コンテンツを返さないか、この状態を処理するためにアクションを再ルーティングするにはどうすればよいですか?