2017-04-05 49 views
0

我在MVC模型,如下模型顯示無效即使它包含值

public class person 
{ 
    [Required(ErrorMessage = "Please enter First Name.")] 
    public string first_name {get;set;} 
    [Required(ErrorMessage = "Please enter last Name")] 
    public string last_name {get;set;} 
    [Required(ErrorMessage = "Please enter |DOB")] 
    public DateTime DOB {get;set;} 


} 

POST方法

[HttpPost] 
public ActionResult save_person(person per) 
{ 
if(per.first_name == null || per.first_name =="") 
    per.first_name ="demo_first"; 
if(per.lastname == null || per.lastname =="") 
    per.last_name ="demo_last"; 
if (ModelState.IsValid) //fails even assignment is done above 
{ 


    } 

} 

所以在使用,如果條件我確保模型元素將至少含有一個一定的價值但即使在此之後 ModelState.IsValid失敗並返回到視圖需要名和姓氏

我們該如何實現這個邏輯?

+1

如果你確定它會在上面的行中,檢查'ModelState.IsValid'有什麼意義? –

+0

在你的ActionResult被調用的時候是'per'null還是Empty? – Marco

+0

@DarinDimitrov對不起,我的錯誤還有一些其他值在模型中是必需的,不能指定默認值..對於那些值我需要檢查IsValid – Sachu

回答

3

爲什麼您的模型上的first_namelast_name屬性爲「Required」屬性裝飾,如果它們顯然不是必需的。

這是說,如果你想更新你的控制器部分的模型屬性的值,你可能需要確保您也在ModelState更新:

if (per.first_name == null || per.first_name == "") 
{ 
    per.first_name ="demo_first"; 
    ModelState.Remove("first_name"); 
    ModelState.SetModelValue("first_name", new ValueProviderResult(per.first_name, per.first_name, CultureInfo.InvariantCulture)); 
} 

if (per.last_name == null || per.lastname == "") 
{ 
    per.last_name ="demo_last"; 
    ModelState.Remove("last_name"); 
    ModelState.SetModelValue("last_name", new ValueProviderResult(per.last_name, per.last_name, CultureInfo.InvariantCulture)); 
} 

if (ModelState.IsValid) 
{ 
    ... 
} 
0

我只想補充一些參考到實際的文檔來清除OP的問題,爲什麼改變方法中的屬性不能解決他的問題。

From the docs:

處理模型狀態錯誤

發生模型驗證被調用之前,每個 控制器動作,並且它是操作方法的 責任檢查ModelState.IsValid並適當反應。 在許多情況下,適當的反應是返回某種 錯誤響應,理想地詳述模型驗證 失敗的原因。

這意味着,當您的ActionResult被調用並且.IsValid屬性被設置時,驗證已經發生。

根據你的評論:如果同一個模型需要在不同的視圖中使用,但使用不同的驗證要求,這將是創造一個好主意,一個新的視圖模型與相應的註解:

public class AnotherPersonViewModel { 
    //no required attribute 
    public string last_name {get; set;} 
    //no required attribute 
    public string first_name {get; set;} 
    //... rest of attributes 
} 

在此之後,您始終可以將視圖模型映射到實體模型或您正在執行的任何操作。但是,您可以避免使用不必要的代碼混淆控制器,以糾正架構中的錯誤。

相關問題