ASP.NET MVC2 InputHelper和List.Insert()奇怪的行为

时间:2010-11-10 01:16:51

标签: asp.net-mvc-2

我无法理解这一点......

OUGHT下面的简化代码,用于插入当前时间第二个值的新表单字段。

相反,即使列表操作正确发生(在控制器和调试输出中可验证),View也会渲染一个额外的元素,但似乎只是最终字段值的副本(在提交之前) 。这可以通过在提交之前更改字段来验证 - 值保持不变,新元素与提交的最终值重复。

真正煮我的面条的部分是,如果我将操作从Insert()简单地改为Add(),Add()按预期工作!!

使用此示例模型:

public class MyViewData
{
  List<string> stringData = new List<string>();
  public List<string> StringData { get { return stringData; } }
}

这个控制器:

public class TestController : Controller
{
  public ActionResult Index()
  {
    return View(new MyViewData());
  }

  [HttpPost]
  public ActionResult Index(MyViewData data)
  {
    data.StringData.Insert(0, DateTime.Now.Second.ToString());

    return View(data);
  }
}

这个观点:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Forms.Controllers.MyViewData>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Test
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%      
        System.Diagnostics.Debug.WriteLine("---");
        for (var i = 0; i < Model.StringData.Count; i++)
            System.Diagnostics.Debug.WriteLine("{0}", Model.StringData[i]);
    %>

    <% using (Html.BeginForm()) { %>

        <% for (var i = 0; i < Model.StringData.Count; i++) { %>

            <%: Html.TextBoxFor(model => model.StringData[i])%></br>

        <% } %>

        <div><input type="submit" value="Do it" /></div>

    <% } %>
</asp:Content>

1 个答案:

答案 0 :(得分:1)

这是标准HTML帮助程序的正常行为,并且是设计使然。渲染输入字段时,它们将首先查看请求POSTed值,并且仅在ViewData和视图模型中查看。这基本上意味着您无法更改控制器操作中的POSted值。

因此,如果您的表单包含输入字段:

<%= Html.TextBoxFox(x => x.Id) %>

发布到以下操作

[HttpPost]
public ActionResult Index(MyModel model)
{
    model.Id = "some new value";
    return View(model);
}

在渲染视图时,html帮助器将使用已发布的值。您可以编写一个自定义的html帮助程序来为您完成工作或手动处理它(绝对不建议但是为了记录):

<input type="text" name="StringData[<%= i %>]" value="<%= Model.StringData[i] %>" />