"Поле Id обязательно" сообщение проверки при создании; Id не установлен в [требуется]


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

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

public int Id {get;set;}

[Required]
public string Message {get; set}

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

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

изменить - причина Обнаружено

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

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

EDIT-Update Model technique

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

    [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 67

15 ответов:

Вы можете добавить атрибутов:

 [Bind(Exclude = "Id")] 

на параметре в методе, а не в классе, таким образом, при создании вы можете исключить его, а при редактировании он все равно будет обязательным:

public ActionResult Create([Bind(Exclude = "Id")] User u)
{
    // will exclude for create
}

public ActionResult Edit(User u)
{
    // will require for edit
}

я столкнулся с этой проблемой с формой, в которой я динамически добавлял "объекты" в список. Таким образом, наши пользователи смогли добавлять, удалять или обновлять. Все это работало хорошо, за исключением случаев, когда были созданы новые элементы. По этой причине, в моем случае, исключение свойства Id не было опцией. решение состояло в том, чтобы сделать идентификатор Nullable:

public int? Id { get; set; }

таким образом, существующие элементы будут иметь значение, а новые будут иметь значение null. Хороший материал.

Отличный вопрос и ответы, спас мой ... позади. Мне нужно кое-что добавить, хотя:

вместо

[Bind(Exclude = "Id")]

Я думаю, что лучше использовать

[Bind(Include = "Prop1, Prop2, Prop3, etc")]

.. где Prop1, Prop2 и Prop3 являются ТОЛЬКО свойства, которые вы хотите привязать на уровне действия.

Так как это белый список, а не черный список. Белый список лучше, безопаснее. Таким образом, вы также решаете риск чрезмерной проводки и под проводкой тоже. Смотрите пост Брэда Уилсона.

[Bind(Exclude = "Id")]
public class Hebe
{
      public int Id {get;set;}

      [Required]
      public string Message {get; set}
}

кстати выше он не привязывает свойство Id для вашей модели на create

идентификатор должен быть отправлен от клиента как 0. Модель не имеет проблемы с Id=0, это значение по умолчанию int. Проблема в том, что он не видит значение, поступающее от клиента, или оно приходит с пробелом или нулем. У меня есть скрытый вход, который представляет идентификатор (или в сложном объекте NestedPropertyId/NestedProperty.Id), поэтому я уверен, что он начинается со значения нуля.

<input type="hidden" id="id" value="0" />
<input type="hidden" id="eventId" value="0"/>
<input type="hidden" id="contactId" value="0"/>

также, Когда Ireset форма для добавления нового объекта на стороне клиента, я обязательно инициализирую скрытый с нуля.

надеюсь, это поможет кому-то.

Efy

У меня такая же проблема, используя RC2 с POCO. Если вы называете идентификатор свойства, но не помещаете на него атрибуты проверки, но IsValid говорит, что это необходимо. Если я назову свойство чем-либо, кроме Id, этого не произойдет. Почему я должен исключить Id?

спасибо

добавить ? для инт

[Key]
[HiddenInput(DisplayValue = false)]
public int? ID { get; set; }

в моем случае проблема исходила из того, что ID был типа string. Изменение на int (not nullable) исправил это для меня. Элемент string тип был результатом обратного проектирования плохо спроектированной базы данных.

проверьте в вашем представлении. Удалите, если у вас есть поле hiddenfieldfor id. Это используется только для редактирования. @формат HTML.HiddenFor (Модель => Model.Id)

Я только что создал новый проект MVC2 и добавил простой POCO, а также контроллер и представление. Насколько я понимаю, вы используете привязку модели для создания объекта, то есть

using System.ComponentModel.DataAnnotations;
public class SimpleObject
{
    public int Id {get;set;}
    [Required]
    public string Message { get; set; }
}

в контроллере у нас есть

[HttpPost]
public ActionResult Create(SimpleObject created)
{
    /// do something
}

и в представлении нет редактора для поля ID?

это не должно заканчиваться никакими сообщениями об ошибках. Вместо этого идентификатор должен быть установлен в значение по умолчанию (int), которое равно 0. Это работает для меня. Какая у вас версия MVC2 используя (RC я предполагаю)?

Не поймите меня неправильно: важно предотвратить привязку идентификатора привязками модели, поскольку это позволит злоумышленнику вмешаться в идентификатор объекта. Тем не менее, связыватель модели по умолчанию не должен показывать поведение, которое вы описываете.

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

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

у меня была такая же проблема, и мне удалось решить ее, просто передав пустой экземпляр модели представления в представление во время вызова 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)

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

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

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

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

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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Более Дальнеишее Чтение: