Ошибка при сохранении: указанное преобразование недействительно - PullRequest
1 голос
/ 05 мая 2019

Я получаю эту ошибку:

Значение не может быть нулевым

У меня есть модель представления, которая ссылается на несколько моделей. В связи с этим, html-помощники строго типизированы. В действии post в контроллере он получает viewmodel. У меня есть несколько случаев в POST, один случай - сохранить некоторые поля (одной) таблицы, на которые есть ссылки в viewmodel, в других случаях для сохранения некоторых полей в (несколько) таблиц, на которые есть ссылки в viewmodel

Я добавил точку останова и проследил код, ModelState не возвращает нулевые значения, но когда отладчик достигает var sod_request = new SOD_REQUEST, он не попадает в блок кода и выдает ошибку 'Value cannot be null', указывая в свойство другой модели, в которую я не хочу публиковать данные в первом случае.

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

Я публикую все not null столбцы SOD_REQUEST

В методе Get того же действия я сопоставляю все атрибуты всех моделей

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Initiate(SViewModel vm)
{
        if (vm.IsDelegated == true) //if user checks Delegate
        {
            try
            {
                if (ModelState.IsValid)
                {

                    var s_request = new S_REQUEST
                    {
                        REQUEST_ID = TempData["SRequestID"].ToString(),
                        CREATION_DATE = DateTime.Now.Date,
                        INITIATOR_ID = (Int32)TempData["InitiatorID"],
                        SERVICE_TYPE_ID = 1
                    };

                    db.S_REQUEST.Add(s_request);
                    db.SaveChanges();
                    return View("Success");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, "Unable to save changes.");
                Console.Write("check error:    " + ex);
            }
            return View(vm);
        }

}

Я ожидаю сохранить в одну таблицу только те атрибуты, которые я сопоставил

Почему поле в другой модели запрашивает значение? Это потому, что я использую строго типизированные представления?

Ответы [ 3 ]

0 голосов
/ 08 мая 2019
  var s_request = new S_REQUEST(
                    {
                        REQUEST_ID = TempData["SRequestID"].ToString(),
                        CREATION_DATE = DateTime.Now.Date,
                        INITIATOR_ID = (Int32)TempData["InitiatorID"],
                        SERVICE_TYPE_ID = 1
                    });

Используйте это, потому что () скобки требуются с конструктором

0 голосов
/ 08 мая 2019

перед синтаксическим анализом данных вы должны проверить нулевое значение

REQUEST_ID = (TempData["SRequestID"] != null)? TempData["SRequestID"].ToString() : TempData["SRequestID"], 

INITIATOR_ID = (TempData["InitiatorID"] != null)? Int32.Parse(TempData["InitiatorID"]):TempData["InitiatorID"],
0 голосов
/ 06 мая 2019

Когда вы запускаете новую строку SOD_REQUEST, которая выполняет все следующее:

                WS_REQUEST_ID = TempData["SODRequestID"].ToString(),
                CREATION_DATE = DateTime.Now.Date,
                INITIATOR_ID = (Int32)TempData["InitiatorID"],
                INITIATOR_NAME = TempData["InitiatorName"].ToString(), //may remove later
                SERVICE_TYPE_ID = 1,
                INITIATOR_COMMENTS = vm.InitiatorComments,
                DELEGATED_EMPLOYEE_ID = vm.DelegatedTeamMemberId,
                IS_DELEGATED = vm.IsDelegated,
                REQUEST_STATUS = (Int32)CommonClasses.RequestStatus.DELEGATED

Я предполагаю, что TempData ["SODRequestID"] или TempData ["InitiatorName"] равны нулю.Если это так, легко исправить:

            WS_REQUEST_ID = TempData["SODRequestID"]?.ToString(),
            INITIATOR_NAME = TempData["InitiatorName"]?.ToString(), //may remove later

Обратите внимание на?Я добавил.

...