ModelState всегда действителен - PullRequest
2 голосов
/ 17 апреля 2010

У меня что-то очень простое не работает.

У меня есть модель

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 Поле заголовка в объекте Customer имеет значение, поэтому данные передаются, но не проверяются?

Есть какие-нибудь подсказки?

Ответы [ 2 ]

5 голосов
/ 17 апреля 2010

В вашем представлении я не вижу ни текстового поля, ни поля, позволяющего отправлять данные на контроллер, только метку. Свойства не будут проверены, если они не опубликованы . Добавьте текстовое поле, оставьте его пустым, и ваша модель больше не будет действительной:

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

UPDATE:

Вот код, который я использовал:

Модель:

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: я переименовал переменную в действии Index на cs. Я помню, что в ASP.NET MVC 1.0 возникали некоторые проблемы, когда у вас был префикс и переменная с одинаковым именем, но я не уверен, применимо ли это здесь, и думаю, что это исправлено.

0 голосов
/ 18 апреля 2010

Понял, это потому, что я ссылаюсь на System.ComponentModel.DataAnnotations 3.6 вместо 3.5.Из того, что я понял, 3.6 - только для услуг WCF RIA.

...