下拉列表始终将modelstate设置为无效

时间:2011-01-22 17:01:05

标签: c# asp.net-mvc asp.net-mvc-3 razor

这有什么不对吗?

@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
              }
            }

2 个答案:

答案 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)

如果所选变量类型不是字符串,则模型状态对于下拉列表始终无效。