C# MVC 4:未使用列表中的正确数据呈现视图<&燃气轮机;在模型中

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

有一个相当棘手的ASP.NETMVC错误(使用MVC4)。我已经试着去除代码,以便使这个例子尽可能清楚

我有一个模型

//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();