C# 保存时出错:指定的强制转换无效
我得到这个错误: 值不能为空 我有一个引用多个模型的viewmodel。 在视图中,html帮助程序是强类型的。 在控制器中的post操作中,它接收viewmodel。 我在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时,它不会进入代码块
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分。所以如果它为空,它就不会发布了?或者它将接受空值?我接受了你的回答,谢谢你的帮助