代码之家  ›  专栏  ›  技术社区  ›  Jaimal Chohan

ModelState始终有效

  •  1
  • Jaimal Chohan  · 技术社区  · 14 年前

    我有一些看起来很简单的东西不起作用。

    我有一个模型

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

    视图模型

    public class CustomerViweModel
    {
        public Customer Customer { get; set; }
    }
    

    一种看法

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

    和一个控制器

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

    无论输入什么作为标题(空或字符串>10个字符),modelstate.isvalid始终为true。客户对象中的标题字段有一个值,因此数据正在传递,但没有被验证?

    有什么线索吗?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Darin Dimitrov    14 年前

    在您的视图中,我没有看到任何允许向控制器发送数据的文本框或字段,只有一个标签。性能意志 not be validated if they are not posted . 添加文本框,保留为空,您的模型将不再有效:

    <%= Html.TextBoxFor(m => m.Customer.Name.Title)%>
    

    更新:

    这是我使用的代码:

    模型:

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

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        [HttpPost]
        public ActionResult Index([Bind(Prefix = "Customer")]Customer cs)
        {
            return View(new CustomerViewModel
            {
                Customer = cs
            });
        }
    }
    

    观点:

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

    提交此表单时,将显示验证错误。

    备注1:我省略了 Entity 我不知道模型中的基类是什么样子的。

    备注2:我已将索引操作中的变量重命名为 cs . 我记得在ASP.NET MVC 1.0中,当前缀和变量名相同时,存在一些问题,但我不确定这是否适用于这里,我认为它已被修复。

        2
  •  0
  •   Jaimal Chohan    14 年前

    我明白了,因为我引用的是System.ComponentModel.DataAnnotations 3.6而不是3.5。据我所知,3.6仅适用于WCF RIA服务。