MVC Ajax开始表单保存,然后使用保存在视图中后返回的ID

时间:2012-10-18 14:11:33

标签: asp.net-mvc razor

我有一个带有两个实体的模型(与外键链接),每个实体都有自己的使用局部视图呈现的选项卡。每个选项卡也有自己的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();

2 个答案:

答案 0 :(得分:0)

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

ModelState.Remove("Entity1.ID1");

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

答案 1 :(得分:0)

我在项目中遇到了同样的问题。我解决问题的唯一方法是在它为0时不包含id。这样​​当它返回时,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>
    }