使用DropDownLists约束和选择Model值

时间:2013-01-08 10:09:12

标签: asp.net-mvc-3 model-validation

我有一个客户模型

public class Customer
{
    public virtual int CustomerID { get; set; }

    [Required]
    public virtual string CustomerName { get; set; }

    [Required]
    public virtual string Title { get; set; }

    [Required]
    public virtual string FirstName { get; set; }

    public virtual string LastName { get; set; }

    // Cont..
}

当我将客户创建表单发布到public ActionResult Create(Customer customer)这是CustomerController中的操作时,会产生针对ModelState的错误。例如......如果我的代码如下所示..

[HttpPost]
public ActionResult Create(Customer customer)
{
    customer.Title = "Mr"; // This is what I set for ensuring the field has value

    if (ModelState.IsValid)
    {
        // Code to save customer entity
    }
    // else..
}

在我的MVC视图中,它显示了客户标题中的错误

例如,如果我从上面的代码中删除if (ModelState.IsValid)部分,客户实体保存得很好,我可以在数据库中看到记录。

这可能是什么问题?

编辑:

将客户标题传递为IEnumerable<SelectListItem>

ViewData["CustomerTitles"] = GetCustomerTitles();

视野中的代码

div class="editor-field">
    <%: Html.DropDownList("CustomerTitles")%>
    <br /><%: Html.ValidationMessageFor(model => model.Title) %>
</div>

2 个答案:

答案 0 :(得分:0)

试试这个:

<%: Html.DropDownList("Title", new SelectList(ViewData["CustomerTitles"]), Customer.Title.ToString()) %>

这应该有希望将标题作为字符串传递,这是您的模型所要求的。

答案 1 :(得分:0)

谢谢,我从@Richard A.的回复中学到了这个问题的答案。 我对我的代码进行了一些修改,它运行正常。

我在下面发布,所以可能会帮助一些人。

来自Controller的ViewData

ViewData["Title"] = GetCustomerTitles(customer.Title);

查看

<div class="editor-field">
  <%: Html.DropDownList("Title") %>
  <br /><%: Html.ValidationMessageFor(model => model.Title) %>
</div>

理念是..在实体中,字段名称是“标题”。发布表单后,编译器检查名为“Title”的HTML元素并分配其值。如果不存在,则将ModelState的值设置为false。