如果这是MVC3的问题,那里会有关于此的帖子,但我找不到。我一定做错了什么。我有一个简单的视图(Index.cshtml),它使用for循环遍历列表。在每次迭代中,我输出两个文本输入,其中包含一个列表项的值。
@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
@Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
@Html.Encode("\n");
@Html.TextBoxFor(m => m.SortOptions[i].Direction);
@Html.Encode("\n");
}
<input type="submit" value="Submit" />
@{Html.EndForm();}
我有两个控制器用于视图,一个用于GET请求,一个用于POST。 POST版本向列表添加的项目与GET版本不同。这就是问题所在。重新加载页面后,文本框的值与GET上加载页面时的值相同。
起初我认为它一定是缓存问题,但是如果我修改代码(如下所示),要手动添加文本输入并将值注入html,新值将被发送到浏览器。 / p>
@{Html.BeginForm();}
@Html.Encode("\n")
@for (int i = 0; i < Model.SortOptions.Count; i++ )
{
var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
var directionName = string.Format("SortOptions[{0}].Direction", i);
var directionID = string.Format("SortOptions_{0}__Direction", i);
<input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
<input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />
}
<input type="submit" value="Submit" />
@{Html.EndForm();}
我已逐步完成代码,以确保模型在发送到视图时包含预期值。我甚至通过逐步查看视图中的代码来检查列表的值。它似乎具有正确的值,但是当我在浏览器中查看它时,它具有应该与页面响应GET请求时相对应的值。这是编辑器模板的问题吗?我刚开始使用mvc3和剃须刀引擎,所以有很多我不知道的。任何帮助将不胜感激。
-----更新:添加控制器代码----
[HttpGet]
public ActionResult Index()
{
var inv = new InventoryEntities();
var model = new IndexModel(inv);
model.SortOptions = new List<SortOption>();
model.SortOptions.Add(new SortOption { ColumnName = "Model", Direction = SortDirection.Ascending });
model.SortOptions.Add(new SortOption { ColumnName = "Make", Direction = SortDirection.Ascending });
//Load data
model.LoadEquipmentList();
return View(model);
}
[HttpPost]
[OutputCache(Duration = 1)]
public ActionResult Index(List<SortOption> sortOptions, SortOption sort)
{
var inv = new InventoryEntities();
var model = new IndexModel(inv);
ModelState.Remove("SortOptions");
model.SortOptions = new List<SortOption>();
model.SortOptions.Add(new SortOption { ColumnName = "Type", Direction = SortDirection.Descending });
model.SortOptions.Add(new SortOption { ColumnName = "SubType", Direction = SortDirection.Descending });
model.EquipmentList = new List<EquipmentListItem>();
model.EquipmentList.Add(new EquipmentListItem { ID = 3, AssignedTo = "Mike", Location = "Home", Make = "Ford", Model = "Pinto", Selected = false, SubType = "Car", Type = "Vehicle" });
return View(model);
}
答案 0 :(得分:0)
有一些东西突然出现在我身上 - 没有看到更多的东西很难说但是......这两个都可以这样改写。额外的@
符号不是必需的。
@using(Html.BeginForm()) {
Html.Encode("\n")
for (int i = 0; i < Model.SortOptions.Count; i++ ) {
Html.TextBoxFor(m => m.SortOptions[i].ColumnName);
Html.Encode("\n");
Html.TextBoxFor(m => m.SortOptions[i].Direction);
Html.Encode("\n");
}
<input type="submit" value="Submit" />
}
@using (Html.BeginForm()) {
Html.Encode("\n");
for (int i = 0; i < Model.SortOptions.Count; i++ ) {
var columnNameName = string.Format("SortOptions[{0}].ColumnName", i);
var columnNameID = string.Format("SortOptions_{0}__ColumnName", i);
var directionName = string.Format("SortOptions[{0}].Direction", i);
var directionID = string.Format("SortOptions_{0}__Direction", i);
<input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" />
<input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" />
}
<input type="submit" value="Submit" />
}
否则你的东西看起来是正确的,我无法从头顶看到任何错误。
答案 1 :(得分:0)
请记住,TextBoxFor
等Html帮助程序在绑定其值时会先使用模型状态,然后再使用模型。让我们考虑一个非常简单的例子来说明这意味着什么:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel { Name = "foo" });
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
model.Name = "bar";
return View(model);
}
}
和视图:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(x => x.Name)
<input type="submit" value="OK" />
}
现在,当您提交表单时,您希望文本框中的值更改为"bar"
,因为这是您在POST操作中放置的值,但值不会更改。那是因为模型状态中的键Name
已经存在一个值,其中包含用户输入的内容。因此,如果您希望它能够工作,您需要从模型状态中删除原始值:
[HttpPost]
public ActionResult Index(MyViewModel model)
{
// remove the original value if you intend to modify it here
ModelState.Remove("Name");
model.Name = "bar";
return View(model);
}
同样的事情也发生在你的场景中。因此,您可能需要从POST操作中的模型状态中删除要修改的值。