ModelState始终有效

Jai*_*han 2 asp.net validation modelstate asp.net-mvc-2

我有一些看似非常简单的工作.

我有一个模特

public class Name: Entity
{
    [StringLength(10), Required]
    public virtual string Title { get; set; }
}

public class Customer: Entity
{
    public virtual Name Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

public class CustomerViweModel
{
    public Customer Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一个看法

       <% using(Html.BeginForm()) { %>
                    <%= Html.LabelFor(m => m.Customer.Name.Title)%>
                    <%= Html.TextBoxFor(m => m.Customer.Name.Title)%> 
                    <button type="submit">Submit</button>
        <% } %>
Run Code Online (Sandbox Code Playgroud)

和一个控制器

[HttpPost]
public ActionResult Index([Bind(Prefix = "Customer")] Customer customer)
{
      if(ModelState.IsValid)
           Save
       else
           return View();
 }
Run Code Online (Sandbox Code Playgroud)

无论我输入什么标题(null,或字符串> 10个字符),ModelState.IsValid始终为true.Customer对象中的Title字段有一个值,因此数据被传递,但没有被验证?

有线索吗?

Dar*_*rov 5

在您的视图中,我看不到任何文本框或允许向控制器发送数据的字段,只有标签.如果未发布属性,则不会验证属性.添加一个文本框,将其留空,您的模型将不再有效:

<%= Html.TextBoxFor(m => m.Customer.Name.Title)%>
Run Code Online (Sandbox Code Playgroud)

更新:

这是我用过的代码:

模型:

public class Name
{
    [StringLength(10), Required]
    public virtual string Title { get; set; }
}

public class Customer
{
    public virtual Name Name { get; set; }
}

public class CustomerViewModel
{
    public Customer Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index([Bind(Prefix = "Customer")]Customer cs)
    {
        return View(new CustomerViewModel
        {
            Customer = cs
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyApp.Models.CustomerViewModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using(Html.BeginForm()) { %>
        <%= Html.LabelFor(m => m.Customer.Name.Title)%>
        <%= Html.TextBoxFor(m => m.Customer.Name.Title)%> 
        <button type="submit">Submit</button>
    <% } %>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

提交此表单时,会显示验证错误.

备注1:我省略了Entity模型中的基类,因为我不知道它的外观.

备注2:我已将Index操作中的变量重命名为cs.我记得在ASP.NET MVC 1.0中有一些问题,当你有前缀和变量命名相同但我不确定这是否适用于此,我认为它是固定的.