2012-11-19 34 views
0

我想在選擇元素上使用客戶端驗證,但它在表單初始加載時不起作用。選擇元素客戶端驗證僅在文章後出現

這是在我的模型屬性(這實際上是一類在我的模型中):

[Required(ErrorMessage="Please select an application type.")] 
public override string Application 
{ 
    get 
    { 
     return base.Application; 
    } 
    set 
    { 
     base.Application = value; 
    } 
} 

這是視圖的一部分

<div class="field_title"> 
    Application Type 
</div> 
<div class="field_validation"> 
    @Html.ValidationMessageFor(model => model.CreatePromocode.Application) 
</div> 
<div class="form_field"> 
    @Html.DropDownListFor(model => model.CreatePromocode.Application, 
     SharedLibrary.Entities.DropDownLists.PromocodeApplicationOptions, 
     "Select an application type...") 
</div> 

這是下拉列表項目代碼,我這樣做,所以我可以在其他應用程序中使用它,只是在一個地方而不是在幾個地方更改它

public class DropDownLists 
{   
    public static List<SelectListItem> PromocodeApplicationOptions 
    { 
     get 
     { 
      return new List<SelectListItem>() 
      { 
       new SelectListItem() { 
        Text="Earlybird Registration", Value="Earlybird"}, 
       new SelectListItem() { 
        Text="Standard Registration", Value="Standard"}, 
       new SelectListItem() { 
        Text="Monday Registration", Value="Monday"}, 
       new SelectListItem() { 
        Text="Tuesday Registration", Value="Tuesday"}, 
       new SelectListItem() { 
        Text="Wednesday Registration", Value="Wednesday"}, 
       new SelectListItem() { 
        Text="Multiple Tickets", Value="TicketMany"}, 
       new SelectListItem() { 
        Text="Single Ticket",Value="TicketSingle"} 
      }; 
     } 
    } 
} 

我遇到的問題是當用戶第一次到達頁面時,下拉列表沒有任何客戶端驗證屬性。它看起來像這樣

<select id="CreatePromocode_Application" name="CreatePromocode.Application"> 

一旦形式發佈然而,和的ModelState是無效的,因爲應用程序的類型沒有被選中,在客戶端驗證,然後出現在下拉列表中正常工作。

<select data-val="true" 
    data-val-required="Please select an application type." 
    id="CreatePromocode_Application" 
    name="CreatePromocode.Application" 
    class="valid"> 

我該如何從一開始就得到客戶端驗證工作?我寧願不必手動添加必需的屬性和錯誤消息,因爲這種方式會破壞使用數據註釋的目的。

+0

這是否只發生在下拉列表中或與您的其他模型屬性? – HTX9

+0

只有在下拉列表中,其他屬性(文本框)第一次都有客戶端驗證。 –

回答

1

確保您初始化您的視圖模型的CreatePromoCode財產在這個樣品的默認構造函數:

public class YourViewModel 
{ 
    public YourViewModel() 
    { 
     CreatePromoCode = new CreatePromoCode(); 
    } 

    public BaseCreatePromoCode CreatePromoCode { get; set; } 

} 

public class BaseCreatePromoCode 
{ 
    public virtual string Application { get; set; } 

} 

public class CreatePromoCode : BaseCreatePromoCode 
{ 
    [Required] 
    public override string Application { get; set; } 
} 

的的HtmlHelper將使用您的視圖模型的CreatePromoCode屬性的運行時類型以獲取其屬性的元數據並設置客戶端驗證的數據屬性。 (因此,即使只在派生類上設置了必需屬性,驗證也會起作用。)

當初始發佈後發生錯誤時,MVC聯編程序創建了視圖模型和CreatePromoCode對象的實例。如果您再次渲染視圖以顯示錯誤,當對象已被初始化時,數據屬性將被設置並且客戶端驗證開始工作。

+0

謝謝,那是問題所在。現在看起來很明顯/ facepalm。 –