C# MVC 4:未使用列表中的正确数据呈现视图<&燃气轮机;在模型中
有一个相当棘手的ASP.NETMVC错误(使用MVC4)。我已经试着去除代码,以便使这个例子尽可能清楚 我有一个模型C# MVC 4:未使用列表中的正确数据呈现视图<&燃气轮机;在模型中,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,有一个相当棘手的ASP.NETMVC错误(使用MVC4)。我已经试着去除代码,以便使这个例子尽可能清楚 我有一个模型 //this is the mvc model public class CustomColumnConfiguration //stripped down to the "problem" property only { public CustomColumnConfiguration() { Columns = new List<Colu
//this is the mvc model
public class CustomColumnConfiguration //stripped down to the "problem" property only
{
public CustomColumnConfiguration()
{
Columns = new List<ColumnConfig>();
}
public List<ColumnConfig> Columns { get; set; }
}
//MVC model contains a list of these
public class ColumnConfig
{
public ColumnConfig()
{
Name = "";
Alias = "";
Order = 0.0;
}
public string Name { get; set; }
public string Alias { get; set; }
public double Order { get; set; }
public bool IsEnabled { get; set; }
}
获取和发布控制器代码:
public ActionResult ManageCustomColumns()
{
CustomColumnConfiguration model = GetConfiguration(); //this works
return View(model);
}
[HttpPost]
public ActionResult ManageCustomColumns(CustomColumnConfiguration model)
{
var action = Request.Form["Action"];
if (action.Equals("SaveIndexConfiguration", StringComparison.CurrentCultureIgnoreCase))
{
this.AlertSuccess("Configuration Saved");
SetConfiguration(model); //this works
}
else if(action.StartsWith("remove",StringComparison.CurrentCultureIgnoreCase))
{
var indexToRemove = int.Parse(action.Split('-')[1]);
model.Columns.RemoveAt(indexToRemove);
}
else if (action.StartsWith("add", StringComparison.CurrentCultureIgnoreCase))
{
model.Columns.Insert(0, new ColumnConfig() { Name = "NEW_COLUMN_NAME", Alias = "New Column Alias" });
}
return View(model);
}
如果我有一个列配置为1、2、3、4的页面。我可以单击第2列旁边的“删除”按钮,在VS中调试代码时,我看到名为“2”的ColumnConfig实际上已从模型的Columns属性中删除。在调试razor时,“2”列再次消失
但是,随着IE和Chrome的100%一致性,我看到的行为是1,2,3仍然存在,它只是删除了最后一个(4)。这与我在调试器中看到的完全不一致。我不是MVC的新手,但这一定是我见过的最神奇的bug之一
有人知道会发生什么吗
更新
此外,当我单击add时,我希望在我的html表中有另一行,比如“NEW_COLUMN_NAME”。它确实添加了另一行,但它似乎复制了最后一行的数据,而不是从我的控制器中放入值
同样,当我调试时,我的控制器会说我有一个新的ColumnConfig,其中有“new_COLUMN_NAME”,但实际呈现给客户机的页面中有以前ColumnConfig的数据。这真让人发疯 假设:
标签,但你没有给我们看ManageCustomColumns
操作发送帖子请注意,您正试图根据
Request.Form[“Action”]
的值确定要删除的列配置。此表单字段在HTML中的何处?还请注意,值为remove-1
的按钮被称为RemoveBtn1
,因此结果是所需的值将位于请求中。表单[“RemoveBtn1”]
。您可能需要一个名为“Action”的隐藏表单字段,并在按钮单击上使用Javascript来填充该字段的按钮值。我知道这是一篇旧文章,但我在.RemoveAt()调用中遇到了同样的问题。找到了解决办法。我在调用.RemoveAt()之前添加了这段代码
快速查看-您似乎将属性与列表中的位置/索引等同起来?发布表单时,您能否检查模型参数(并检查列表是否符合您期望的“顺序”)@EdSF。我正在使用索引。当我调试返回控制器的数据时,索引的顺序正确,正确的列索引被删除。就在我返回模型时,页面使用错误的数据呈现。请注意,在调试razor cshtml时,模型中的数据仍然正确。如果删除第2列,我希望它不会像您希望它在表的第一列中显示1、3、4(按该顺序)那样愚蠢。当我删除第2列时,我希望显示1、3、4,但相反,会呈现1、2、3。如果我再次移除第2列,则1,2将被渲染。就像它总是从最后一个索引中删除和添加。在这一点上,我只是要做一点修改,将模型存储在会话中,并重定向回我的GET controller方法。然后,如果会话模型不为null,则使其足够智能以使用会话模型。然后,当我在POST controller上保存模型时,我将清空会话模型。@无论如何,我将+1你的答案,因为你的假设是绝对正确的,然后我更新了我的答案,以表明我已经考虑了你的建议。对其他人来说,它可能仍然是一块有用的金块。是的,我有一个剃刀
,它使用代码块来制作帖子。我还有一个隐藏的“action”(编辑问题以显示此内容)@Html。隐藏的
只有一个参数,只设置字段的名称,而不是ID,但是您的Javascript正在按ID查找该元素。有关文档,请参阅。我刚刚检查了Html.hidden
生成的输入。不管怎样,就像我刚才说的那样,我的控制器代码工作得非常好。我从请求中得到的正是我所期望的。这只是出于某种原因用错误的方式渲染。是的,这是有道理的。ModelState是一个被广泛使用的MVC吗?是的,它作为一个对象存在,任何实现控制器类的东西都可以访问它。它表示已发布到服务器的所有值。因此,该页面的内容和您返回的内容没有对齐,页面在返回值上使用ModelState.Hmm。好主意。考虑到MVC的所有黑匣子特性,如果这是正确的答案,我一点也不会感到惊讶。谢谢你发布这个!我会看看我是否可以用这个来代替我所做的变通方法,如果它有效的话,我会接受你的答案。
$(document).ready(function () {
$(".submit-action").on("click", function (e) {
var $this = $(this);
$("#action").val($this.val());
});
});
public ActionResult ManageCustomColumns()
{
CustomColumnConfiguration model = GetConfiguration(); //this works
return View(model);
}
[HttpPost]
public ActionResult ManageCustomColumns(CustomColumnConfiguration model)
{
var action = Request.Form["Action"];
if (action.Equals("SaveIndexConfiguration", StringComparison.CurrentCultureIgnoreCase))
{
this.AlertSuccess("Configuration Saved");
SetConfiguration(model); //this works
}
else if(action.StartsWith("remove",StringComparison.CurrentCultureIgnoreCase))
{
var indexToRemove = int.Parse(action.Split('-')[1]);
model.Columns.RemoveAt(indexToRemove);
}
else if (action.StartsWith("add", StringComparison.CurrentCultureIgnoreCase))
{
model.Columns.Insert(0, new ColumnConfig() { Name = "NEW_COLUMN_NAME", Alias = "New Column Alias" });
}
return View(model);
}
ModelState.Clear();