这有什么不对吗?
@Html.DropDownListFor(x => x.Post.CategoryId, new SelectList(Model.Categories, "ID", "CategoryName"), "-- Please select --")
@Html.ValidationMessageFor(x => x.Post.CategoryId)
当我提交表单时,模型状态无效,即使我从下拉列表中选择一个值,此下拉列表也会被标记为错误。
(顺便说一句,CategoryId是我帖子表中的FK) 我已将此“伙伴”类添加为部分
[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
}
}
答案 0 :(得分:2)
您发布的此特定代码没有任何问题。可能出错的是您正在发布的控制器操作中期望的模型。例如,如果此模型与用于呈现此视图的模型不同:
[HttpPost]
public ActionResult Index(Post post) { ... }
而不是:
[HttpPost]
public ActionResult Index(ModelContainingPostConmtainingCategoryId post) { ... }
生成的下拉列表的名称如下:name="Post.CategoryId"
如果您的控制器操作未采用具有名为Post
的属性的模型,该属性具有名为CategoryId
的属性,并且CategoryId
属性标有Required
,您将获得您所描述的行为。
其他可能的原因是您有其他必需的属性,而您尚未包含在请求中。找到这个的方法是分析您在控制器操作中返回的模型,看看缺少什么。另外,在调试模式下查看ModelState
属性本身会告诉您哪些属性有验证错误。
更新:
这是一个可以用作基础的完整工作示例:
型号:
[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" />
}
答案 1 :(得分:0)
如果所选变量类型不是字符串,则模型状态对于下拉列表始终无效。