2010-05-12 48 views
3

我有以下的代碼 -雖然[必填]列表字段根據需要顯示,並且模型狀態由於爲空而無效?

查看 -

<% Html.BeginForm(); %> 
    <div> 
<%= Html.DropDownList("DropDownSelectList", new SelectList(Model.DropDownSelectList, "Value", "Text"))%> 

控制器 -

public ActionResult Admin(string apiKey, string userId) 
{ 
    ChallengesAdminViewModel vm = new ChallengesAdminViewModel(); 
    vm.ApiKey = apiKey; 
    vm.UserId = userId; 
    vm.DropDownSelectList = new List<SelectListItem>(); 
    vm.DropDownSelectList.Add(listItem1); 
    vm.DropDownSelectList.Add(listItem2); 
    vm.DropDownSelectList.Add(listItem3); 
    vm.DropDownSelectList.Add(listItem4); 
    vm.DropDownSelectList.Add(listItem5); 
    vm.DropDownSelectList.Add(listItem6); 
    vm.DropDownSelectList.Add(listItem7); 
} 

[HttpPost] 
public ActionResult Admin(ChallengesAdminViewModel vm) 
{ 
    if (ModelState.IsValid)//Due to the null dropdownlist gives model state invalid 
    { 
    } 
} 

ViewModel-

public class ChallengesAdminViewModel 
{ 
    [Required] 
    public string ApiKey { get; set; } 

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

    public List<SelectListItem> DropDownSelectList { get; set; } 
} 

我不知道爲什麼它仍然需要在列表雖不需要。我想根據需要只有兩個屬性。所以我想知道如何聲明或更改該列表以使其不是必需的並且具有我的模型狀態有效。

回答

6

我這樣做的方式是在我的視圖模型中有一個屬性,該下拉將綁定到(可爲空),然後有一個包含所有下拉選項的單獨屬性。

視圖模型性能

public int? CountryId { get; set; } 
public IEnumerable<SelectListItem> CountryOptions { get; set; } 

查看

<label for="CountryId">Country:</label> 
<%: Html.DropDownListFor(x => x.CountryId, Model.CountryOptions, "N/A")%> 

注:"N/A"字符串是默認空值。

HTHS,
查爾斯

詩篇。這當然是使用ASP.NET MVC 2

+0

指出您應該驗證您的「佔位符字段」('CountryId')的值是下拉列表中可能的值之一('CountryOptions');否則我認爲你可以改變HTML來提交一個完全不同的值。 – drzaus 2014-04-04 20:44:54

0

簡單的答案是將其從模型中移除並通過ViewData傳遞。然後,您的模型將包含從列表中選擇的值的成員。

+0

呃......實際上這就是我所做的......但我只是想知道爲什麼它是[required]字段,即使當我沒有設置它。 – Vishal 2010-05-12 21:10:01

+0

沒有「魔術串」可以做到這一點嗎? – mxmissile 2010-05-12 21:10:57

+0

@mxmissile - 看看我的答案爲* no magic string *版本。 – Charlino 2010-05-12 22:41:34

0

我認爲這是失敗的,因爲它不能強制一個值("")放入一個SelectListItem放入一個列表。您只能選擇一個DropDownSelectList值。

您可以嘗試使用您的ChallengesAdminViewModel.DropDownSelectList字符串來代替。那麼它將是所選選項的值。 SelectListItems是爲了將選項推送到視圖而不是解析發佈的結果。