2010-02-07 33 views
4

我有點困惑於ASP.NET MVC的行爲,它不會在POST後改變下拉列表的值。有人可以解釋如何做到這一點。第二個下拉列表選擇的項目在ASP.NET MVC中沒有改變

首先我有一個模型,看起來像這樣:

public class Test 
{ 
    public int OneID { get; set; } 
    public IEnumerable<SelectListItem> OneList 
    { 
     get 
     { 
      yield return new SelectListItem 
      { 
       Text = "Red", 
       Value = "0" 
      }; 
      yield return new SelectListItem 
      { 
       Text = "Green", 
       Value = "1" 
      }; 
      yield return new SelectListItem 
      { 
       Text = "Blue", 
       Value = "2" 
      }; 
     } 
    } 

    public int TwoID { get; set; } 
    public IEnumerable<SelectListItem> TwoList 
    { 
     get 
     { 
      yield return new SelectListItem 
      { 
       Text = "Ruby", 
       Value = "0" 
      }; 
      yield return new SelectListItem 
      { 
       Text = "Gem", 
       Value = "1" 
      }; 
      yield return new SelectListItem 
      { 
       Text = "Bronze", 
       Value = "2" 
      }; 
     } 
    } 
} 

的觀點在人體內含量這個代碼片段:

<% using (Html.BeginForm("Index", "Home", FormMethod.Post)) 
    { %> 
<table> 
    <tr> 
     <td> 
      <% =Html.DropDownList("OneID", Model.OneList, new 
        { @onchange = "this.form.submit();" })%> 
     </td> 
     <td> 
      <% =Html.DropDownList("TwoID", Model.TwoList)%> 
     </td> 
    </tr> 
</table> 
<% } %> 

而且GET和POST動作看起來像這個:

public ActionResult Index() 
{ 
    Test test = new Test(); 
    test.OneID = 0; 
    test.TwoID = 0; 
    return View(test); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(Test test) 
{ 
    test.TwoID = test.OneID; 
    return View(test); 
} 

我想要實現的是改變第二個下拉選擇的項目以匹配第每次第一次下拉改變時,首先下拉。因此,我從第一個下拉列表中獲取選定的值,並將其分配給第二個下拉列表使用的ID,然後返回相同的模型。第一個下拉菜單在視圖中正確設置,但不是第二個下拉菜單。

想法?

回答

1

這不工作,你希望它是這樣的原因,因爲當DropDownList助手試圖使其首先查找匹配name在這種情況下是TwoID,並使用此值,而不是認爲發帖值選擇元素模型中的值。例如,這與TextBox相同。如果您使用此幫助程序並且在POST控制器操作中修改模型的值,它仍會顯示舊值。這就是助手的工作方式。它們從POST的值綁定。

有兩種可能的解決方法:

  1. 使用JavaScript這兩種下拉列表同步:

    @onchange = "document.getElementById('TwoID').value = this.value; this.form.submit();" 
    

    BTW這應該在一個不顯眼的方式在一個單獨的JavaScript文件來完成:

    $(function() { 
        $('#OneID').change(function() { 
         $('#TwoID').val($(this).val()); 
         this.form.submit(); 
        }); 
    }); 
    
  2. 編寫自己的幫手或手動生成選擇(少推薦)

+0

感謝您的答案Darin。我的例子是設法提煉問題的本質。我正在處理的實際應用程序很複雜,儘管我可以用JavaScript來完成,但它需要更多的編碼 - 不過,這可能是唯一的解決方案。 問題:無論如何在視圖引擎使用它們之前銷燬或更改POST'd值嗎?我嘗試修改Request.Form [「TwoID」]的值,但我懷疑它是隻讀的。如果我可以說明所有POST'd值,那麼幫助者會從模型中讀取這些值作爲回退? – Guy 2010-02-07 16:51:31

相關問題