2012-05-01 47 views
1

我有這樣的代碼在我看來:Html.DropDownList沒有驗證

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"type="text/javascript"></script> 

... 

    <div class="modal_label"> 
     @Html.LabelFor(model => model.Organization.Type) 
    </div> 
    <div class="modal_field"> 
     @Html.DropDownListFor(model => model.Organization.Type, (IEnumerable<SelectListItem>)ViewBag.TypeList, String.Empty) 
     @Html.ValidationMessageFor(model => model.Organization.Type) 
    </div> 

如果我改變@ Html.DropDownFor到@ Html.EditorFor,然後驗證工作,但在這種情況下,我有以下的HTML渲染:

<select id="Organization_Type" name="Organization.Type" class="valid"> 
... 
</select> 

這裏是我的模型:

[MetadataType(typeof(OrganizationMetaData))] 
public partial class Organization 
{ 

} 

public class OrganizationMetaData 
{ 
    [Required(ErrorMessageResourceType = typeof(CCMESResources.ResourceErrors),ErrorMessageResourceName = "ValueIsRequired")] 
    public int Type { get; set; } 
} 

當窗體的帖子,也有ModelState中的錯誤。你可以幫我嗎?

+1

向我們展示您的模型 – archil

+0

您可以在視圖頂部添加@ Html.ValidationSummary(),並向我們展示您得到的確切錯誤。你確定它與Type屬性有關嗎? – archil

+0

它不顯示,直到它的帖子任何驗證消息並且在[驗證所需的選擇中的DropDownList]的控制器 – karaxuna

回答

3

確保您使用可空類型上的視圖模型:

[Required] 
public int? Type { get; set; } 

在你的模型,你似乎已經使用了非空整型是不連貫的和你正在努力實現什麼你的看法。

還要確保您發佈此表來控制動作發生的視圖模型作爲操作參數。

+0

感謝的我現在 – karaxuna

+0

我已經改變INT爲int試試嗎?但它不工作...我也做過這種驗證的其他觀點,其中的參數是不可爲空和 – karaxuna

+0

你能提供一個完整的,但簡潔的例子讓我們來重現問題能正常工作? –

1

在你的模型(或視圖模型),當值從下拉列表分配給它,如果所選的第一個值是一個空字符串或null,它「應該」觸發validatation,但它會採取去服務器去做。我一直沒有成功獲得不引人注目的驗證,無需先發布帖子即可爲客戶端工作。對於所需的值使用可爲空的字段通常不是一個好主意。此外,因爲您沒有使用可空字段,所以在您檢查模型是否有效時應強制進行驗證。下面是從我的項目的一個片段,其工作原理(也,我使用的是data annotation extensions爲 「最小」 的註釋):

型號:

[Display(Name = "Ticket Priority")] 
[Min(1, ErrorMessage = "You must select a ticket priority.")] 
public int TicketPriorityID { get; set; } 

查看:

<div class="editor-label"> 
    @Html.LabelFor(model => model.TicketPriorityID) 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("TicketPriorityID", string.Empty) 
    @Html.ValidationMessageFor(model => model.TicketPriorityID) 
</div> 

控制器(HTTPGET ):

ViewBag.TicketPriorityID = new SelectList(db.TicketPriorities.OrderBy(x => x.TicketPriorityID).ToList(), "TicketPriorityID", "Name"); 

控制器(HttpPost):

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

通過Required屬性驗證工作正常。我在ModelState中看到這裏有一個組織類型是必需的錯誤。我不明白爲什麼它不起作用在客戶端 – karaxuna

+0

我認爲這與下拉列表有關。我讀過之前,你甚至不應該驗證下拉列表,但在這種情況下,如果你想要一個空值作爲默認值,你需要。雖然我不能給你一個很好的答案,但爲什麼這不起作用。我有同樣的問題。 –

+0

好的,非常感謝Eric Garrison。現在我應該回家了。如果你發現你的問題的答案,請讓我知道。 – karaxuna