«Поле Id обязательное» сообщение проверки при создании; Идентификатор не установлен на [Обязательно] - PullRequest
69 голосов
/ 27 января 2010

Это происходит, когда я пытаюсь создать объект с помощью действия «Создать стиль» в Asp.Net MVC 2.

POCO обладает следующими свойствами:

public int Id {get;set;}

[Required]
public string Message {get; set}

При создании сущности Id устанавливается автоматически, поэтому в действии Create нет необходимости.

ModelState говорит, что «поле Id обязательно», но я не установил, что это так. Здесь происходит что-то автоматическое?

РЕДАКТИРОВАТЬ - Причина раскрыта

Причину проблемы ответил Брэд Уилсон через Пола Сперанца в одном из комментариев ниже, где он говорит (аплодирует Полу):

Вы предоставляете значение для ID, вы просто не знали, что были. Это в данных маршрута по умолчанию маршрут ("{controller} / {action} / {id}"), и его значение по умолчанию является пустым строка, которая недопустима для int. Используйте атрибут [Bind] на вашем параметр действия для исключения идентификатора. мой маршрут по умолчанию был: новый {контроллер = "Клиент", действие = "Редактировать", id = "" } // Параметры по умолчанию

РЕДАКТИРОВАТЬ - Обновить технику модели

Я действительно изменил способ, которым я сделал это снова, используя TryUpdateModel и связанный с этим массив параметров исключения.

    [HttpPost]
    public ActionResult Add(Venue collection)
    {
        Venue venue = new Venue();
        if (TryUpdateModel(venue, null, null, new[] { "Id" }))
        {
            _service.Add(venue);
            return RedirectToAction("Index", "Manage");
        }
        return View(collection);
    }

Ответы [ 15 ]

0 голосов
/ 05 декабря 2017

Вы можете отключить эту неявную проверку, установив параметр AddImplicitRequiredAttributeForValueTypes на DataAnnotationsModelValidatorProvider, добавив следующее к вашему Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Дополнительная литература :

0 голосов
/ 08 июня 2016

Я также столкнулся с той же проблемой с вами, и теперь я уже решил это. С помощью HttpGet вам нужно вернуть в View пустую модель. Такие как

[HttpGet]
public ActionResult Add()
{
    //Your code here
    return View(new Venue);
}

Я надеюсь, что это полезно с вами.

0 голосов
/ 08 июня 2015

У меня была та же проблема, и мне удалось ее решить, просто передав пустой экземпляр модели представления в представление во время вызова GET моего метода Create.

//GET: DocumentTypes/{Controller}/Create
    public ActionResult Create()
    {
        return View(new DocumentTypeViewModel());
    }

    //POST: DocumentTypes/{Controller}/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(DocumentTypeViewModel viewModel)
    {
        if(ModelState.IsValid) {

            var result = AddDocumentType(viewModel);
            if(!result.HasValidationErrors) {
                return RedirectToAction("Index");
            }

            ModelState.Update(result);

        }

        return View(viewModel);
    }

А потом, на мой взгляд, я гарантирую, что у меня есть

@Html.HiddenFor(m => m.ID)

Таким образом, мне не нужно явно указывать атрибуты Bind

0 голосов
/ 29 января 2015

Выше верны ответы. Любое, как каждый следует за другим сценарием. Мое решение заключается в следующем для той же проблемы. Если ваш идентификатор является первичным ключом, то вам нужно его инициировать, я хочу сказать, когда вы передаете модель для просмотра в методе get, просто создайте новый объект перед ним. Он установит 0 для вашего идентификатора вместо нуля.

0 голосов
/ 01 февраля 2010

У меня была та же проблема, за исключением того, что у меня было три целочисленных поля в моей модели. Мне удалось обойти это, установив все мои целочисленные свойства, которые ошибочно требовались для обнуляемых целых.

...