Member 10754595 Ответов: 1

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


Я работаю над существующим проектом в MVC5 в том смысле, что в моей модели создания есть раскрывающийся список под названием Department, который я имею ниже требуемого файла.
 [Required]
public int DepartmentID { get; set; }

Теперь человек, который использует это, не хочет требуемой проверки, я попытался сделать ее обнуляемой, добавив(?) после int. но он не позволяет мне измениться, я получаю ошибку на своем контроллере, который не может неявно преобразовать тип "int?" в "int". Существует явное преобразование (вы пропускаете приведение?) Я думаю, что из-за первичного ключа, но не уверен, что кто-нибудь может мне помочь, пожалуйста
 // [Required]
public int? DepartmentID { get; set; }

а также я попробовал эту линию, добавив в свой контроллер
ModelState.Удалить("DepartmentID");

[ValidateAntiForgeryToken]
       public ActionResult Create(CreateModel model)
       {
           ModelState.Remove("DepartmentID");
           if (ModelState.IsValid)
           {

               document.DepartmentID = model.DepartmentID; // Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?)


Что я уже пробовал:

Я пытался изменить int на int? и удаление идентификатора отдела из (ModelState.Функция IsValid)

1 Ответов

Рейтинг:
7

David_Wimbley

Я не думаю, что это имеет какое-то отношение к первичному ключу, если только вы не говорите, что DepartmentId-это первичный ключ.

Мое предложение состояло бы в том, чтобы добавить в ваш DropDownListFor data опцию по умолчанию "Select" и установить значение этого Select равным 0. Поскольку ваше поле является целым числом и предполагает, что оно требуется как таковое в базе данных, то оно все равно будет равно 0. Если 0-это возможное значение, то установите его равным...-1.

Таким образом, ваш код будет выглядеть следующим образом

var selectData = new List<SelectListItem>();
selectData.Add(new SelectListItem { Text ="Select", Value = "-1"});
selectData.Add(new SelectListItem { Text ="Actual Selection", Value = "Actual Value"});

@Html.DropDownListFor(m=>m.DepartmentID, selectData, new{@class=""})


Таким образом, если выбор не сделан, вы знаете, что -1 означает, что они не выбрали никаких значений.

Другой вариант-передать его как -1, а когда проверка выполняется, использовать оператор коалесцирования null, чтобы по умолчанию значение равнялось 0, если то, что приходит из модели, равно null.

Экс: var safeDeptId = (DepartmentID ?? 0); Таким образом, если ни один параметр не был выбран, ваш дефолт равен 0 и не должен получить ошибку, указывающую на отсутствие приведения.

Просто несколько идей о том, как решить вашу проблему.


Member 10754595

извините не получилось
получил ошибку ниже.

Оператор INSERT конфликтует с ограничением внешнего ключа "FK_dbo.Documents_dbo.Departments_DepartmentID". Конфликт произошел в базе данных "азбуки", таблица "dbo.Департаменты", столбец 'идентификатор'.
Заявление было прекращено.

David_Wimbley

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

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

Либо добавьте опцию в таблицу отделов "Не выбрано", которая предоставит вам действительный идентификатор для вставки в таблицу документов, либо покиньте отдел по мере необходимости. Если вы все еще не можете оставить его как требуется, и вы не хотите вставлять опцию в таблицу отделов как "не выбранную", то вам нужно пересмотреть структуру вашей таблицы, потому что вы не сможете сделать DepartmentId необязательным с внешним ключом в вашей БД, что делает его обязательным. Здесь левая рука должна говорить с правой.

Member 10754595

Теперь это действительно сработало (DepartmentID ?? 1) с 1 не с 0
Большое спасибо за вашу помощь! это спасает мне жизнь.