2010-04-15 84 views
1

我非常沮喪,試圖在幾年的webforms開發之後切換到MVC。DataBinding ASP.NET MVC中的DropDownList 2

這是我無法解決的極其簡單的問題: 我有一張名爲StateProvince的表中的狀態列表。 我有一個DropDownList。 我想讓DropDownList顯示所有的狀態。

保持簡單,我對MVC一無所知。

這是我的。所有這些給了我一個填充「System.Web.Mvc.SelectListItem」的DropDownList。

操作:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     SelectList theList = new SelectList(stateProvinces); 
     ViewData["StateProvince"] = theList; 
     return View(); 
    } 

查看:

<div class="editor-label"> 
       <%: Html.LabelFor(model => model.StateProvinceId) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (SelectList)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+0

是Model.StateProvinces實際上填充了對象AND St​​ateProvinceId包含一個非空值AND模型!= null? – Michel 2010-04-15 20:11:03

+0

你可以展示這個動作嗎? – 2010-04-15 20:12:30

+0

好吧我假設創建是你的GET ...哪裏是處理帖子和返回結果的代碼?這就是我認爲問題出在哪裏,並且ViewData不會在通話之間持續存在,但我可能完全誤解了這個問題。問題是初始加載還是在發佈結果並重建視圖之後? – Kelsey 2010-04-15 20:52:45

回答

0

常見的瀏覽器不支持HTML表單中PUT動詞。您可能需要處理這個用ajax:

$(function() { 
    // when some button is clicked: 
    $('#someButton').click(function() { 
     $.ajax({ 
      url: '/controller/action', 
      data: { selectedState: $('#StateProvinceId').val() }, 
      type: 'PUT', 
      success: function(data) { 
       alert('state successfully submitted'); 
      } 
     }); 
     return false; 
    }); 
}); 
+0

對不起,我其實是指POST。 – 2010-04-15 19:56:42

0

當數據被公佈,在DropDown列出的項目不回發到模型,所以我假設你是不是再次獲取它們,並重新將它們添加在將模型返回到視圖之前將其添加到模型中。

您需要確保您的帖子中填寫了Model.StateProvinces,然後將其傳遞給您的視圖。與WebForms不同,WebForms只會保留這些值,這些值將保留ViewState中的DropDownList項目併爲您重建它們。

因此,假如你的控制器看起來像:

// POST: /YourController/YourAction/{ID} 
[HttpPost] 
public ActionResult YourAction(YourModel model, int id) 
{ 
    // model.StateProvinceId has the selected value 

    // you need to fill StateProvinces since it is empty as the list is not posted 
    // back so it is not autofilled into your model. 
    model.StateProvinces = LoadYourStateProvincesList(); 

    // This would blow up if StateProvinces is null because your View is assuming that 
    // it has a valid list of StateProvinces in it to build the DropDown 
    return View(model); 
} 

其實我問了一個問題,而回,可能是一些使用的,以幫助解釋如何處理下拉列表:

Best way of implementing DropDownList in ASP.NET MVC 2?

編輯:根據你的評論,你甚至沒有得到第一個列表...以及它看起來像你可能沒有正確的模型設置。你甚至有模特嗎?您的創建僅返回View(),其中沒有模型數據。您需要創建一個模型並將其返回。

例如,

public class YourModel 
{ 
    public int StateProvinceId { get; set; } 
    /// ... whatever else you need 
} 

// Then in your view your controller you need to set it and create it 
View(new YourModel() { StateProvinceId = 123 };); 

您需要的型號,以便當窗體回你可以檢索值,因爲MVC的東西會值到模型就像個例子我張貼以上關於POST部分。

編輯:好了,現在問題更清楚了,比原來的問題簡單得多,使問題成爲現實。問題是你的SelectList需要告訴它哪些字段放在哪裏:你有

SelectList theList = new SelectList(stateProvinces, "Value", "Text"); 

在你原來的問題:

<%: Html.DropDownListFor(model => model.StateProvinceId, new SelectList(Model.StateProvinces, "StateProvinceId", "Name"))%> 

這是完全正確的,但它是如何你建立Model.StateProvinces這是錯誤的,所以它讓我覺得它必須是別的東西。

+0

如何完成以下操作:使DropDownList顯示StateProvince表中的行的列表,其中顯示在DropDownList中的Text爲「Name」列,值爲列「StateProvinceId」。 – 2010-04-15 20:50:44

+0

我的意思是,我甚至沒有嘗試發佈數據。 – 2010-04-15 20:51:19

+0

我正在使用POST模型綁定器。 – 2010-04-15 21:09:49

1

這是我一直在尋找:

操作:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     ViewData["StateProvince"] = stateProvinces; 
     return View(); 
    } 

查看:

<div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (IEnumerable<SelectListItem>)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+1

沒有模型被分配到視圖,所以'model => model.StaeProvinceId'如何工作?看看我對我的回答所做的修改。 – Kelsey 2010-04-15 21:15:25

1

嘗試更換此

SelectList theList = new SelectList(stateProvinces); 

這... ...

SelectList theList = new SelectList(stateProvinces, "Value", "Text");