2011-07-16 32 views
1

我有這樣的視圖模型AllowHtml,HttpRequestValidationException和ModelState中

public class FooBarViewModel 
{ 
    public string Foo { get; set; } 

    [AllowHtml] 
    public string Bar { get; set; } 
} 

而是拋出一個HttpRequestValidationException如果.Foo與它的HTML提交的,我想一個消息添加到ModelState。我怎麼能這樣做?

回答

1

您也可以使用[AllowHtml]屬性修飾Foo屬性,並在控制器內部檢查它是否包含允許您向模型狀態添加自定義錯誤的HTML。

+0

現在可能會工作。我希望利用現有的一些操作過濾器或其他東西,但不知道從哪裏開始。 – kenwarner

+0

@qntmfred,你確實可以使用操作濾波器實現了個IExceptionFilter接口和陷阱HttpRequestValidationException那裏,但問題是,你可以做的是錯誤添加到模型狀態和渲染視圖,但控制器的動作將不會被執行。這意味着如果您決定走這條路線,您還必須注意將視圖模型傳遞給您可能在此自定義操作過濾器內返回的ViewResult。這是說你仍然可以裝點AllowHtml foo的屬性,然後有一個自定義的行爲過濾,檢查... –

+0

...張貼的值是否包含HTML,如果它只需添加一個錯誤模型的狀態。如果必須的話,那當然會避免你在多個控制器動作上重複這個邏輯。 –

0

異常將DefaultModelBinder內的地方調用ValueProvider.GetValue點拋出。

要更改行爲以捕捉異常並將其轉換爲ModelState錯誤,您需要擴展或替換DefaultModelBinder

一種可能性是覆蓋BindModel,並在它調用GetValue點:

ValueProviderResult valueProviderResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation); 

嘗試和捕獲異常並調用bindingContext.ModelState.AddModelError

問題是DefaultModelBinder相當複雜,所以您可能需要仔細考慮如何進行這樣的更改與模型綁定生態系統的其餘部分進行交互。

相關問題