Нет ничего плохого в этом конкретном коде, который вы опубликовали. Что может быть не так, так это модель, которую вы ожидаете в действии контроллера, которое публикуется. Например, если эта модель отличается от модели, использованной для визуализации этого представления:
[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" />
}