2014-03-27 126 views
1

我有包含以下兩個字符串循環似乎每次

  1. 組阿爾法
  2. 組布拉沃

控制器

public ActionResult Task(TaskModel model) 
{ 

    return PartialView(model); 
} 
一個字符串數組稱爲組以產生相同的值

調用我的任務動作的索引視圖

<div id="update"> 

    @using (Ajax.BeginForm("Task", "Home", new AjaxOptions { UpdateTargetId = "update", InsertionMode = InsertionMode.Replace})) 
    { 

     <input value="Group Alpha" name="Groups"/> 
     <input value="Group Bravo" name="Groups"/> 

     <button type="submit">Submit</button> 
    } 

</div> 

我的任務視圖

@model MvcApplication4.Models.TaskModel

<div id="container"> 

     @if (Model.Groups != null) 
     { 

      foreach (var group in Model.Groups) 
      { 

       @Html.TextBox("Groups", group, new { @id = String.Empty })               

      } 
     } 
</div> 

我的任務模型

public class TaskModel : IValidatableObject 
{ 
    public Guid TaskId { get; set; } 
    public String Name { get; set; } 

    public string[] Groups { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 

     yield break; 
    } 
} 

這隻能產出集團阿爾法集團阿爾法。這個問題呢?

對不起,複製發行https://www.dropbox.com/s/s2o59cu00am3eov/MvcApplication4.zip

+0

你可以爲'Model.Groups'添加一些演示代碼嗎? –

+5

你認爲你是第一個在'foreach'循環中使用'@ Html.TextBox'的人嗎?這是不太可能的,所以它更可能是你的代碼中的錯誤。你確定你正在調用正確的過載嗎?你能告訴你如何填充'Model.Groups'?你能打印@ @ Html.Raw(組)嗎? – CodeCaster

+3

不管你使用的是什麼'IEnumerable',都是這樣編寫的,它在迭代時改變它的結果,一個常見的例子是關閉循環變量C#5.0前的版本,儘管當然還有其他一些方法可以讓真正的惡意迭代器這個。 – Servy

回答

3

你POST一些輸入字段名爲Groups。在處理POST的操作方法中,您呈現使用@Html.TextBox("Groups", ...)的部分。

@Html.TextBox使用ModelState根據輸入元素名稱用先前的POST值填充值。在這種情況下,它會在POST中找到第一個Groups值,即「Group Alpha」。

在渲染局部視圖之前清除ModelState(或者只是Groups鍵)。

此:

ModelState.Clear(); 
ModelState.Remove("Groups"); 

return PartialView(model); 

作品。

下次嘗試預先顯示所有相關的代碼,所以我們不需要太多的評論要求你。 :-)

+0

啊我實際上有另一個行動:(謝謝你的幫助,但我儘可能快的速度,因爲我的公司代碼,所以我必須先重構它:( – heymega

+0

@CodeCasterv - 是不是這是一個缺陷,但爲什麼會基於輸入元素名稱?它是完全合法的,有多個相同名稱的元素 – heymega

+0

這是有效的(你可以完美地讀取代碼中的值),但這不是PHP,它不是你應該如何處理列表請參閱[提交具有相同名稱的表單元素](http://stackoverflow.com/questions/437955/submitting-form-elements-with-the-same-name)關於如何實現相同的屬性使用MVC的行爲 – CodeCaster

-1

這是一個閉合的問題,我覺得沒有說清楚前

示例項目。試試這個代碼:

<div id="container"> 

    @if (Model.Groups != null) 
    { 
     foreach (var group in Model.Groups) 
     { 
      var currentGroup = group; 
      @Html.TextBox("Groups", currentGroup, new {@id = String.Empty}); 
     } 
    } 
</div> 
+0

他*沒有*關閉在顯示的代碼中的變量,即使他是,它不會產生指出的問題(沒有辦法,它會導致第一項打印兩次;最多可能導致最後一個項目被打印兩次)。問題出在其他地方的代碼中。 – Servy

+0

@Servy - 你能解釋他如何不關閉變量嗎? – Haney

+0

你能解釋他*如何關閉變量,因爲沒有匿名方法,這是在C#中創建閉包的唯一方法嗎? – Servy