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