C #, Valid ModelState завершается ошибкой .isValid - PullRequest
2 голосов
/ 16 марта 2012

C # validStateState не удается .isValid

Контроллер поиска

//
// GET: /Search/Create
public ActionResult Create()  { return View();  } 

//
// POST: /Search/Create
[HttpPost]
public ActionResult Create(Search search)
{
    search.Created = DateTime.Now;

    search.SearchSet = "test data";
    search.URLParameter = 1432567389;

    if (ModelState.IsValid)
    {
        _db.Searchs.Add(search);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(search); 
}

Класс поиска

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace TalentProfile.Models
{
    public class Search
    {
        public int Id { get; set; }
        [Required]
        public int URLParameter { get; set; }
        [Required, MaxLength(50, ErrorMessage = "Client must be 50 characters or less")]
        public string Client { get; set; }
        [DataType(DataType.MultilineText), StringLength(150, ErrorMessage = "{0} must be {1} characters or less")]
        public string Notes { get; set; }
        [Required]
        public string SearchSet { get; set; }
        [Required]
        public DateTime Created { get; set; }
    }
}

Если я запускаю в режиме отладки, все поля в классе установлены правильно, но это не удается ModelState.IsValid. Если я углублюсь в ModelState.IsValid, это неверно. Развернувшись далее, я обнаружил ошибку «Поле SearchSet является обязательным». Поле SearchSet правильно установлено на «данные теста». Если я удалю ModelState.IsValid, проверка сохранится в базе данных успешно.

Почему я получаю ошибку «поле обязательно для заполнения», если поле содержит действительные данные.

Контролер талантов

//
// GET: /Talent/Create
public ActionResult Create()
{
    return View();
}

//
// POST: /Talent/Create
[HttpPost]
public ActionResult Create(Talent talent)
{
    talent.Modified = talent.Created = DateTime.Now;

    if (ModelState.IsValid)
    {
        _db.Talents.Add(talent);
        _db.SaveChanges();
        CreatePhoto(talent.Id);
        return RedirectToAction("Index");
    }

    return View(talent);
}

Обновлено: поиск контроллера и создание представления

//
// GET: /Search/Create
public ActionResult Create()
{ 
    Search search = new Search();
    search.SearchSet = "test Data";
    return View(search);
}

//
// POST: /Search/Create
[HttpPost]
public ActionResult Create(Search search)
{
    search.Created = DateTime.Now;

    search.URLParameter = 1435267836;

    if (ModelState.IsValid)
    {
        _db.Searchs.Add(search);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(search);
}

В поле зрения поставлено: @Html.HiddenFor(model => model.SearchSet)

Ответы [ 4 ]

2 голосов
/ 16 марта 2012

Здесь следует отметить пару вещей:

1) бессмысленно добавлять атрибут Required в типы значений.Типы значений должны всегда содержать значение, они не могут быть нулевыми .. поэтому Required всегда будет проходить для них.

В частности, DateTime является типом значения.Кроме того, ваш UrlParameter является int, который также является типом значения.он всегда будет содержать хотя бы значение по умолчанию.Required является избыточным.

2) Как уже говорили другие, ModelState устанавливается только во время привязки данных.привязка данных происходит только перед вызовом метода или при вызове UpdateModel или TryUpdateModel.Независимо от того, есть ли у вас другие ошибки, вы не можете обновить модель и ожидать, что ModelState отразит изменения, если вы не вызывали UpdateModel или TryUpdateModel.

3) Клиент установлен так, как требуется, но вы не 'Кажется, это настраивает.Поэтому, если вы установите Client и SearchSet, тогда выполните TryUpdateModel (search), это должно быть допустимо.

4) Талант работает, потому что, как и в Search, talent.Modified и talent.Created являются DateTime s и неОбнуляемый, поэтому они никогда не пройдут проверку, даже если вы не установите значение (убедитесь сами, удалите назначение и посмотрите, как оно все еще проверяется).Любые другие обязательные поля, которые вы можете иметь в Talent, также могут быть типами значений.

1 голос
/ 16 марта 2012

ModelState разрешается во время привязки модели, поэтому для объекта Search, переданного в Create, должно быть установлено значение SearchSet.Т.е. установка SearchSet в контроллере не сделает модель действительной, если значение было пустым во время привязки модели.

1 голос
/ 16 марта 2012

Использовать TryUpdateModel (поиск); перед вашей проверкой ModelState. Так и должно быть:

[HttpPost]
public ActionResult Create(Search search)
{
    search.Created = DateTime.Now;
    search.SearchSet = "test data";
    search.URLParameter = 1432567389;

    TryUpdateModel(search);

    if (ModelState.IsValid)
    {
        _db.Searchs.Add(search);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(search); 
}
0 голосов
/ 16 марта 2012

Среда выполнения MVC уже проверила бы модель перед выполнением вашего действия и не проверила бы ее после локальной установки параметров в действии.

Так что идея в том, что вы делаете сообщение смодель поиска в нем, например, из HTML-формы, и MVC проверяет правильность ПЕРЕД введением в действие, поэтому вам не нужно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...