保存时出错:指定的 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"],
我收到此错误:
Value cannot be null
我有一个引用多个模型的视图模型。
在视图中,html 助手是强类型的。
在控制器中的 post 动作中,它接收视图模型。
我在 POST
有多个案例,
一种情况是保存 viewmodel 中引用的(一个)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"],