2011-01-22 5 views
0

何が問題ですか?私は、フォームを送信するとドロップダウンリストは常にmodelstateを無効に設定します

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

にModelStateは無効であり、このドロップダウンリストには、私は、ドロップダウンリストから値を選択するにもかかわらず、エラーとしてフラグが付けられます。

私は部分的

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

} 

class Post_Validation 
{ 

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

} 

コントローラとして、この「バディ」クラスを追加haved (ところで区分は私のポスト表ではFKがある):

// 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"とあれば、あなたのコントローラーアクションは、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

+0

@raklosでは、非整数をドロップダウンの値として使用している可能性があります。また、null可能な整数でのみ発生します。 nullでない整数を使用している場合、この場合は例外が発生します。 'CategoryId'はあなたが投稿しているコントローラーアクション内の値に割り当てられていますか? –

+0

CategoryIdはnullに戻ります。IDはすべてintで、selectの各オプションのソース値を表示する整数は整数でもあります。 – raklos

0

選択した変数タイプが文字列でない場合、モデル状態は常にドロップダウンに無効です。

関連する問題