保存时出错:指定的 Cast 无效

Error on Save: Specified Cast is not Valid

我收到此错误:

Value cannot be null

我有一个引用多个模型的视图模型。 在视图中,html 助手是强类型的。 在控制器中的 post 动作中,它接收视图模型。 我在 POST 有多个案例, 一种情况是保存 viewmodel 中引用的(一个)table 的一些字段, 将某些字段保存到视图模型

中引用的(多个)table的其他情况

我加了断点跟踪代码,ModelState没有return任何空值,但是当调试器到达var sod_request = new SOD_REQUEST时,它没有进入代码阻止并抛出 'Value cannot be null' 错误,指向另一个模型的 属性,我不想在第一种情况下 post 数据。

我使用万无一失的库在视图模型中处理了验证。 我获得 'Value cannot be null' 的属性具有 RequiredIfFalse 验证属性

我 post SOD_REQUEST

的所有 not null

在同一个动作的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);
        }

}

我希望仅将我映射的属性保存到一个table

为什么它要求另一个模型中的字段具有值? 是因为我使用的是强类型视图吗?

当您执行 new 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

注意 ?我加了。

  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
                    });

使用这个是因为构造函数需要 () 括号

你应该在解析数据之前检查是否为空

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

INITIATOR_ID = (TempData["InitiatorID"] != null)? Int32.Parse(TempData["InitiatorID"]):TempData["InitiatorID"],