我无法理解这一点......
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>
答案 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] %>" />