2011-05-05 84 views
2

使用MVC3我發現設置SelectList的選定值正確呈現HttpGet上的視圖,但無法在HttpPost上正確呈現。我已經檢查了模型,然後將它們轉發到HttpPost上的視圖,並且它們正在被正確更新,但似乎視圖並未正確呈現所選標記。爲什麼SelectList SelectedValue在HttpGet上工作,但不在HttpPost上工作?

在HttpPost上,<select>與其在任何編輯之後但在提交表單之前存在完全相同。執行HttpPost方法中的m.SelectedWidgetId = 2;,更新模型,但不反映在視圖中。

我在這裏錯過了什麼?

型號:

public class WidgetModel 
{ 
    private Widget[] Widgets { 
     get 
     { 
      return new Widget[] { 
       new Widget { Id=1, Name="Item 1" }, 
       new Widget { Id=2, Name="Item 2" }, 
       new Widget { Id=3, Name="Item 3" } 
      }; 
     } 
    } 
    public SelectList WidgetList 
    { 
     get 
     { 
      return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId); 
     } 
    } 
    public int SelectedWidgetId { get; set; } 
} 

查看:

@model thisProject.Models.WidgetModel 

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");  
    <input type='submit' />                      
} 

控制方法;

public ActionResult Widget() 
{ 
    var m = new WidgetModel(); 
    m.SelectedWidgetId = 1; 
    return View(m); 
} 
[HttpPost] 
public ActionResult Widget(WidgetModel m) 
{ 
    m.SelectedWidgetId = 2; 
    return View(m); 
} 
在asp.net MVC的SelectList的的SelectedValue

回答

3

發生這種情況的原因是HTML幫助程序在呈現值時始終在模型中的值之前使用請求中的值。這基本上意味着,如果你想在POST操作修改一些值,你需要從模型狀態首先除去它:

[HttpPost] 
public ActionResult Widget(WidgetModel m) 
{ 
    ModelState.Remove("SelectedWidgetId"); 
    m.SelectedWidgetId = 2; 
    return View(m); 
} 

或助手將簡單地忽略手動設置的值,並使用一個由用戶發佈。

+0

真棒,解決了我的問題,非常感謝。 – 2011-05-05 06:34:50

+1

@Darin - 你是怎麼變得如此聰明? :) – Sam 2011-11-06 00:01:58

2

由其中當我們使用強類型的輔助即

<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%> 

在Model.selectedwidgetID的這種情況下,價值被創建下拉菜單中的屬性值覆蓋將覆蓋在

中設置的值
相關問題