2013-06-02 31 views
0

我最近遇到了一個很奇怪的問題,雖然在工作之前只想提及,但我做了很多修改,現在我的應用程序有點搞砸了,所以我不得不重啓一下,但我仍然有這種奇怪的行爲,基本上有兩件事,但我認爲它們是相互關聯的!張貼表格後的構造函數值爲空

所以我有這樣一種模式:

public class MyModel 
{ 
     [Required] 
     public string Username{ get; set; } 

     public UserLocation Location { get; set; } 
} 

以及用戶位置是:

public class UserLocation 
    { 
     public UserLocation() 
     { 
      if (CountryId != null) 
      { 
       //do something 
      } 
     } 

     [Required] 
     public string CountryId { get; set; } 
... 
} 

所以我認爲我有這個正確生成與編輯模板,沒事的時候充滿在,它直接顯示錯誤,但現在,它不知道錯誤!但在此之前!其次,當我點擊一個按鈕,所以一個httppost方法被激發,首先構造函數UserLocation被調用,但是countryID被填充,它顯示爲空!以前不是這樣,在我搞砸之前,構造函數被調用了httppost並設置了值,比如country id,我不知道爲什麼,但是我的代碼在構造函數中總是被解僱,但現在不再了。

值設置和調試我可以看到它!

任何想法是什麼問題?

更新:

這裏是我的編輯模板,這是它的樣子,你可以看到我有validateion消息

<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CountryId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CountryId, Model.Countries, "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CountryId) 
    </td> 
</tr> 

更新2:關於確認

所以我有@ Html.EditorFor ...並沒有驗證客戶端,當我將其更改爲@ Html.Partial ...與一切都一樣,完好無損它開始驗證客戶端,爲什麼這個問題?任何想法以及如何使它與editorfor和客戶端驗證一起工作?

HTML與editorfor看起來是這樣的:

<select name="Location.CountryId" id="Location_CountryId"> 

HTML中的部分看起來像這樣:

<select name="CountryId" id="CountryId" data-val-required="The Country field is required." data-val="true"> 
+0

行'if(CountryId!= null)'在構造函數中沒有意義,因爲在構建對象時它總是爲null。你真的想在那裏完成什麼? – Yuck

+0

這是如此奇怪,但在構造函數中我有價值之前,因爲它是httppost,不知何故我得到了價值觀,我可以做一些額外的東西,如填寫另一個列表或其他東西。可以這樣,我使用的是editorFor而不是html.partial? – Alnedru

回答

0

直接顯示一個錯誤,但現在,它並沒有顯示錯誤!但在此之前!

聽起來像是你有可能禁用客戶端驗證 - 檢查,以確保你已經包括了驗證腳本,即

<script src="/Scripts/jquery.validate.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.js"></script> 

,並在web.config

<appSettings> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings> 

已啓用的選項

其次,當我點擊一個按鈕,所以一個httpp ost方法被觸發,首先構造函數UserLocation被調用,但是countryID被填充,它顯示爲空!是什麼之前並非如此

這是沒有道理給我,CountryId只能設置後的對象被創建(除非它傳遞給到構造函數,它是不是)。因此,在設置CountryId之前調用構造函數。如果這是一個ViewModel,那麼這種代碼似乎並不正確,但任何類型的驗證都應該在類之外完成 - 可能是在服務層中,或者取決於它是多麼簡單的控制器。

+0

你錯了,viewmodel不應該驗證自己。問題的核心問題在於構造函數中似乎有驗證樣式代碼。視圖模型驗證的大部分應該由屬性處理,而其他任何由自定義驗證方法處理。 –

+0

沒有一切都是正確的,因爲視圖中的其他字段在要求的 – Alnedru

+0

@PeterLaCombJr上進行了驗證。視圖模型*不應該*驗證自己,這是*驗證器*作業,數據註釋可以幫助它做到這一點。視圖模型的要點是將信息傳遞到視圖 - 就是這樣。一般來說,它不應該有任何*種類的業務邏輯,但是,如果它特別與視圖模型相關,那麼它們在其中的* some *代碼沒有任何損害。模型純粹是因爲模型的狀態可以被視爲「有效」,這取決於模型的使用方式。 – James