无法在mvc

时间:2016-06-12 22:39:24

标签: asp.net entity-framework asp.net-mvc-4

当我尝试使用单个视图并在同一个控制器上创建和编辑时,管理ID时出现错误。 我可以通过以下方式管理它:

@Html.HiddenFor(m => m.ID)

但在创建(添加)记录时,我无法获取ID [错误 ID 字段是必需的] 。检查时出现错误( ID是数据库中的主键):

ModelState.IsValid

因为我能够使用以下方式管理ID:

  [Bind(Exclude = "ID")]

但是这会在编辑时产生问题。请给我一个使用相同控制器添加和编辑的方法。

3 个答案:

答案 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();
}

编辑:这应该可以解决......