2011-01-22 48 views
0

這是什麼問題?下拉列表始終設置模型狀態無效

@Html.DropDownListFor(x => x.Post.CategoryId, new SelectList(Model.Categories, "ID", "CategoryName"), "-- Please select --") 
@Html.ValidationMessageFor(x => x.Post.CategoryId) 

當我提交表單的ModelState是無效的,這個下拉列表中被標記爲錯誤,即使我從下拉列表中的值。

(順便說一句類別ID是在我的崗位表的FK) 我haved加入這個「哥們」級爲部分

[MetadataType(typeof(Post_Validation))] 
public partial class Post 
{ 

} 

class Post_Validation 
{ 

    [Required(ErrorMessage = "Please select a Category")] 
    public int CategoryId { get; set; } 

} 

控制器:

// GET: /News/Add 
     [Authorize] 
     public ActionResult Add() 
     { 
      var model = new AddPostViewModel() { Categories = categoryRepository.GetAllCategories(), Post = new Post(), IsEditMode=false }; 
      return View(model); 
     } 


      // 
      // POST: /News/Add 
      [Authorize] 
      [HttpPost] 
      public ActionResult Add(AddPostViewModel model) 
      { 
       if (!ModelState.IsValid) 
       { 
       ..etc 
       } 
      } 

回答

2

沒有什麼錯與此特定您發佈的代碼。什麼可能是錯誤的是您正在發佈的控制器操作期望的模型。例如,如果這種模式是不一樣的用於呈現此視圖的模型:的

[HttpPost] 
public ActionResult Index(Post post) { ... } 

代替:

[HttpPost] 
public ActionResult Index(ModelContainingPostConmtainingCategoryId post) { ... } 

產生的下拉列表的名稱將是以下幾點:name="Post.CategoryId",如果你的控制器操作不採用名爲Post的屬性的模型,該屬性的名稱爲CategoryId,此CategoryId屬性標記爲Required,您將獲得所描述的行爲。

其他可能的原因是,您有其他屬性是必需的,而您沒有包含在您的請求中。找出這一點的方法是分析您在控制器操作中獲得的模型,並查看缺少的內容。在調試模式下查看ModelState屬性本身會告訴您哪些屬性有驗證錯誤。


UPDATE:

下面是一個可以作爲基礎的完整工作示例:

型號:

[MetadataType(typeof(Post_Validation))] 
public class Post 
{ 
    public int CategoryId { get; set; } 
} 

class Post_Validation 
{ 
    [Required(ErrorMessage = "Please select a Category")] 
    public int CategoryId { get; set; } 
} 

public class AddPostViewModel 
{ 
    public IEnumerable<SelectListItem> Categories { get; set; } 
    public Post Post { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new AddPostViewModel() 
     { 
      Categories = Enumerable.Range(1, 5).Select(x => new SelectListItem 
      { 
       Value = x.ToString(), 
       Text = "category " + x 
      }), 
      Post = new Post() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(AddPostViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      ... 
     } 
     ... 
    } 
} 

查看:

@model AppName.Models.AddPostViewModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(x => x.Post.CategoryId, new SelectList(Model.Categories, "Value", "Text"), "-- Please select --") 
    @Html.ValidationMessageFor(x => x.Post.CategoryId) 
    <input type="submit" value="OK" /> 
} 
+0

該模型顯示正常,當我刪除DDL類別的validationfor它提交沒問題。 CategoryId是一個int ...可能是一個問題? – raklos 2011-01-22 17:40:52

0

如果您選擇的變量類型不是字符串,那麼您的模型狀態對於您的下拉列表將始終無效。

相關問題