2017-10-04 72 views
2

假設我們有CreateEdit動作方法歸於HttpPost並且它們具有model類型的參數,例如BlogViewModel,如下所示。ModelState.IsValid = true是否保證傳遞的模型參數不爲null?

[HttpPost] 
public IActionResult Create(..., BlogViewModel model) 
{ 
.... 
} 

[HttpPost] 
public IActionResult Edit(..., BlogViewModel model) 
{ 
.... 
} 

在他們的身體裏,我們通常會做如下驗證。

if(ModelState.IsValid) 
{ 
// do something 
} 

在這裏,do something可以訪問model的性質的操作。

問題

我不知道是否有在這model成爲null的可能性。如果modelnull然後do something(諸如訪問的model一個屬性)將拋出異常。

我讀了很多的例子(從互聯網和教科書),我還沒有看到有人這樣做仔細檢查尚未如下。

if(model!=null) 
{ 
    if(ModelState.IsValid) 
    { 
    // do something 
    } 
} 

if(ModelState.IsValid) 
{ 
    if(model!=null) 
    { 
    // do something 
    } 
} 

也許,條件ModelState.IsValidtrue保證modelnull

我的假設是否正確?恐怕我正在做一個定時炸彈的假設。

+1

該模型將只'null'如果有與您其他錯誤代碼 –

+0

@StephenMuecke:所以有必要總是做仔細檢查所示我上面的代碼?或'ModelState.IsValid = true'不能保證'model!= null'? –

+0

無論如何,檢查'null'通常是個好主意。假設它不應該是'null',一切進展順利,但重構或其他錯誤配置(例如路由)可能會導致它爲空。 – DiskJunky

回答

3

要回答你的問題,不,ModelState.IsValid不檢查,如果你的模型是空,如果出現這種情況會引發錯誤。

在API這是很容易產生空的模型,如果你犯了一個錯誤,同時建立您的請求模型,它不匹配端點所期待的。

或其他人可以看看你的網站,看到API調用,並決定有一些樂趣和與不具備有效的模型請求淹沒你的API。

有辦法檢查空模型在一個地方,如這裏:ModelState is valid with null model

1

什麼是模型狀態? ModelState代表在POST期間提交給服務器的名稱和值對的集合

ModelState中有什麼? 以下是這些價值觀的樣子,從相同的調試會話: 屬性enter image description here 每個人都有一個包含提交給服務器的實際值ValueProviderResult的一個實例。

模型狀態驗證錯誤... 如: -

[Required] 
public string FirstName { get; set; } 

[StringLength(50, ErrorMessage = "The Last Name must be less than {1} characters.")] 
public string LastName { get; set; } 
在這種情況下,如果你的名字包含超過50個caracters,ModelState中如有虛假

,因爲有例外vaueProvidedResult

希望你得到的低估有關的ModelState

回答你的問題是你可以處理模型從modelState

如果模型null自動modelState無效

+0

OP沒有問'ModelState'是什麼! –

+0

@StephenMuecke是整個問題的答案,他需要了解你可以處理模型modelState –

+0

_if模型null自動modelState不valid_錯誤 –

1

答案根本不是。

ModelState表示嘗試將發佈的表單(標記爲BeginForm)綁定到還包含驗證信息的操作方法。它包含默認模型聯編程序設置,其指定應將哪些驗證設置包括在視圖模型中,例如, RequiredAttribute,以便對所需字段進行空值檢查取決於存在哪些驗證設置,而不是在ModelStateDictionary本身。

當提交表單時,DefaultModelBinder設置viewmodel綁定並檢查綁定viewmodel類內的每個屬性是否存在驗證設置(即屬性)。如果提交的值與設置的標準不匹配(例如null /標記爲RequiredAttribute的屬性中的空值),則會將驗證錯誤添加到ModelState.Errors屬性,並且隨後ModelStateDictionary.IsValid返回false,因爲它取決於Errors屬性計數。這裏是從IsValid採取ModelStateDictionary source檢查機制:

public class ModelStateDictionary : IDictionary<string, ModelState> 
{ 
    private readonly IDictionary<string, ModelState> _innerDictionary; 

    public ICollection<ModelState> Values 
    { 
     get { return _innerDictionary.Values; } 
    } 

    public bool IsValid 
    { 
     get { return Values.All(modelState => modelState.Errors.Count == 0); 
    } 
} 

因此,如果所有的模型屬性設置爲空/空而不指定RequiredAttribute,由於沒有驗證ModelStateDictionary.IsValid值仍然true屬性本&模型結合的作品。

類似的問題:

ModelState.IsValid even when it should not be?

相關問題