当我尝试使用单个视图并在同一个控制器上创建和编辑时,管理ID时出现错误。 我可以通过以下方式管理它:
@Html.HiddenFor(m => m.ID)
但在创建(添加)记录时,我无法获取ID [错误: ID 字段是必需的] 。检查时出现错误( ID是数据库中的主键):
ModelState.IsValid
因为我能够使用以下方式管理ID:
[Bind(Exclude = "ID")]
但是这会在编辑时产生问题。请给我一个使用相同控制器添加和编辑的方法。
答案 0 :(得分:0)
添加时尝试设置Id = 0,您需要隐藏输入以进行编辑(发送回ID)。
当您创建新对象并设置Id = 0时,这意味着EF将自行计算Id。
编辑对象时,必须将Id发送回控制器,因为Id是对象的属性,EF使用它来确定哪个对象正在更新。
从绑定中排除Id并不是一个好主意;)如果排除Id,那么控制器/ EF将如何知道从视图发回的对象?
<强>澄清:强>
在您看来,您应该只有:@Html.HiddenFor(m => m.Id)
在您的情况下,您可以/应该在添加新对象时在控制器/操作中设置Id=0
。
如果你想在一个视图中添加/编辑对象,你可以在你的添加动作中创建空对象(并设置Id = 0)并将其传递给你的视图...然后你总是拥有有效的对象/模型查看您添加或编辑的内容。
添加操作的示例:
public void Create(int id)
{
// ...
return View(new YourObject {
Id = 0,
});
}
答案 1 :(得分:0)
您始终在视图中将ID包含为隐藏字段:
@Html.HiddenFor(m => m.Id)
不要使Id属性成为必需,因此验证将始终通过。如果它为0或null(如果您的Id属性为可空类型),则将其视为插入。否则执行更新:
if (ModelState.IsValid)
{
if (!model.Id.HasValue || model.Id == 0){
{
// Do insert here..
} else {
// Do update here...
}
}
答案 2 :(得分:0)
如果要为创建和编辑创建单个视图,则应首先检查ID
如果表单将id传递为0,则其创建否则为编辑
[HttpPost]
public ActionResult Create(Model model)
{
if(model.id != 0 )
{
//Edit Code here
}
if( model.id == 0)
{
//Create Code Here
}
return RedirectToAction("","");
}
因为您已将ID保持为隐藏状态。传递ID时不会有任何问题。
但在HTTPPOST之前
在HTTPGET上......遵循以下代码
Public Action Result Create(int id = 0)
{
if(id != 0)
{
var model = //code for selecting the data for the respective id
return view (model);
}
return view();
}
编辑:这应该可以解决......