C# 保存时出错:指定的强制转换无效

C# 保存时出错:指定的强制转换无效,c#,asp.net-mvc-5,entity-framework-6,C#,Asp.net Mvc 5,Entity Framework 6,我得到这个错误: 值不能为空 我有一个引用多个模型的viewmodel。 在视图中,html帮助程序是强类型的。 在控制器中的post操作中,它接收viewmodel。 我在POST中有多个案例, 一种情况是保存viewmodel中引用的(一)个表的一些字段, 将某些字段保存到viewmodel中引用的(多个)表的其他情况 我添加了一个断点并跟踪了代码,ModelState不会返回任何空值,但是当调试器到达var-sod\u-request=new-sod\u-request时,它不会进入代码块

我得到这个错误:

值不能为空

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

我添加了一个断点并跟踪了代码,
ModelState
不会返回任何空值,但是当调试器到达
var-sod\u-request=new-sod\u-request
时,它不会进入代码块并抛出
值不能为空
错误,指向另一个模型的属性,在第一种情况下,我不想将数据发布到该模型

我使用万无一失的库在viewmodel中处理验证。 我在上获取的属性“Value cannot be null”具有
RequiredIfFalse
validation属性

我发布所有
notnull
列的
SOD\u请求

在相同操作的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);
        }
}

我希望只将映射的属性保存到一个表中

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

当执行执行以下所有操作的行new SOD\u请求时:

                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

注意到了吗?我添加了。

当您执行执行以下所有操作的行new SOD\u请求时:

                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
  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
                    });
我猜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
                    });
使用此选项是因为构造函数需要()括号


之所以使用此选项,是因为构造函数需要()括号

在解析数据之前,您应该检查是否为null

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

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

在分析数据之前,您应该检查是否为null

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

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

我加了一个?。它现在应该接受空值吗?不管怎样,我还是尝试了,但仍然将另一个模型的属性指向null。我现在正在跟踪SOS_请求块中的值,我添加了?。它现在应该接受空值吗?因为我不想发布空值,所以这些值在db中不是空的。我跟踪了我正在发布的属性的值,所有的hold values都将每个TempData值分配给一个局部变量,其中一个返回null,正如您所指出的。非常感谢,先生?意味着如果到该点为止的所有内容都为null,则对变量应用null并停止处理。顺便问一下,你能接受这个答案吗?这将使我得到10000分。所以如果它为空,它就不会发布了?或者它将接受空值?我接受了你的回答,谢谢你的帮助,我加上了?。它现在应该接受空值吗?不管怎样,我还是尝试了,但仍然将另一个模型的属性指向null。我现在正在跟踪SOS_请求块中的值,我添加了?。它现在应该接受空值吗?因为我不想发布空值,所以这些值在db中不是空的。我跟踪了我正在发布的属性的值,所有的hold values都将每个TempData值分配给一个局部变量,其中一个返回null,正如您所指出的。非常感谢,先生?意味着如果到该点为止的所有内容都为null,则对变量应用null并停止处理。顺便问一下,你能接受这个答案吗?这将使我得到10000分。所以如果它为空,它就不会发布了?或者它将接受空值?我接受了你的回答,谢谢你的帮助