0

我有一个包含两个实体(用外键链接)的模型,每个实体都有自己的选项卡,使用局部视图呈现。每个选项卡也有自己的 Ajax 表单。当我在第一个选项卡中保存实体时,我现在有了要返回到两个部分视图的实体的 ID,以便能够保存第二个实体或保存对第一个实体的更新。我无法将此值返回给视图。

该模型:

public class Entity1
{ 
    int ID1  { get; set; }
    [Some attributes]
    string field1 { get; set; }
}
public class Entity2
{ 
    int ID2  { get; set; }
    [Some attributes]
    string field2 { get; set; }
}
public class MyModel
{ 
    Entity1 entity1 = new Entity1()
    Entity2 entity2 = new Entity2()
}

控制器:

public class MyController : Controller
{
[HttpGet]
public ActionResult Index()
{
    var model = new MyModel();
    model.entity1.ID1 = 0;
    model.entity2.ID2 = 0;
    return PartialView(model);
}

[HttpPost]
public ActionResult Index(MyModel model)
{
    SaveMyModel(model)
    // have tried ModelState.Clear(); here
    return PartialView(model);
}
}

最后是两个部分视图之一

@model MyModel
@using (Ajax.BeginForm("Index", "Home",
        new AjaxOptions
        {
            HttpMethod = "POST"
        }
        ))
    {
    @Html.LabelFor(m => m.Entity1.field1)
    @Html.EditorFor(m => m.Entity1.field1)
    @Html.HiddenFor(m => m.Entity1.ID1)
    <div class="form-actions">
        <button type="submit">
        Next section</button>
    </div>
    }

我的保存函数根据 ID1 的值插入或更新。

问题是 ID1 的值始终保持为零,并且隐藏字段在返回时不会刷新。我尝试单步执行剃刀刷新,并且正确的 ID 被发送到视图。

以上是一个简化,但它确实封装了问题。

先感谢您。

更新

如果出现以下情况,我可以让它工作:

  • 我的模型中只有一个实体
  • ModelState.Clear();在保存之前添加
4

2 回答 2

0

如果您打算在 POST 控制器操作中修改它,则需要从 ModelState 中删除该值:

ModelState.Remove("Entity1.ID1");

这样,您无需使用 ModelState.Clear 清除整个 ModelState,而只需清除您实际修改的值。这样,Html 助手将从您的模型中选择值,而不是 ModelState 中的值。

于 2012-10-18T16:17:19.693 回答
0

我在我的项目中遇到了同样的问题。我解决它的唯一方法是在 id 为 0 时不包含它。这样当它回来时,id 被替换了。因此,在您的示例中,您将执行以下操作:

@model MyModel
@using (Ajax.BeginForm("Index", "Home",
        new AjaxOptions
        {
            HttpMethod = "POST"
        }
        ))
    {
    @Html.LabelFor(m => m.Entity1.field1)
    @Html.EditorFor(m => m.Entity1.field1)
    @if(Model.Entity1.ID1 !=0){
         Html.HiddenFor(m => m.Entity1.ID1)
    }
    <div class="form-actions">
        <button type="submit">
        Next section</button>
    </div>
    }
于 2013-09-25T14:58:39.237 回答