2010-11-10 59 views
0

我無法理解這一點......ASP.NET MVC2 InputHelper和List.Insert()奇怪的行爲

下面的簡化代碼應該插入當前時間的第二個值的一種新形式的領域。

相反,即使列表操作正確發生(在控制器和調試輸出中可驗證),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

這是標準的HTML輔助的正常行爲,是設計。在渲染輸入字段時,他們將首先查看請求POSTed值,並且僅在ViewData和視圖模型中查看。這基本上意味着你的不能更改控制器操作中的POS值。

所以,如果你有一個輸入字段的表單:

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

被渲染視圖後面的HTML幫助將使用貼值發送到下列行動

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

。你既可以寫一個自定義的HTML幫助,沒有工作,爲您或手動處理它(絕對不推薦,但備案):

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

嗯。好。我不明白這樣做的動機,但我可以看到它會如何產生這種效果。是否可以在綁定完成後清除發佈的數據,以便視圖從頭開始每個響應? – 2010-11-10 16:40:57

+0

好的,有機會嘗試它。控制器中的ModelState.Clear()使其工作。謝謝! – 2010-11-10 22:20:03