2013-02-19 24 views
0

我一直在試圖找出如何從一個下拉列表翻新值回傳給視圖與結果asp.net mvc4下拉列表返回模型顯示在同一視圖

控制器顯示相同的下拉列表:

// 
// GET: /ProductByID/ 

[HttpGet] 
public ActionResult ProductById() 
{ 
    ViewBag.IDNumbers = ddlItems; 
    return View(); 
} 


// 
// POST: /ProductByID/ 

[HttpPost] 
public ActionResult ProductById(FormCollection formdata) 
{ 
    string selected = formdata["IDNumbers"]; 
    int id = int.Parse(selected); 
    Product p = items.GetByID(id); 
    return View(p); 
} 

的觀點:

@model ProductsMVC_Basic.Models.Product 

@{ 
    ViewBag.Title = "Product By Id"; 
} 


<script src="~/Scripts/jquery-1.7.1.js"></script> 
<script> 
    $(function() { 
     $("#IDNumbers").change(function() { 
      if ($("#IDNumbers").val() != "") { 
       this.form.submit(); 
      } 
     }); 
    }); 
</script> 

<div> 
    @using (Html.BeginForm("ProductById", "Home", FormMethod.Post)) 
    { 
     @Html.DropDownList("IDNumbers", "--Select One--") 
    } 

</div> 

這工作只要填充下拉列表和發送FORMDATA回控制器。我的問題是如何在後視圖中顯示模型數據,以便顯示下拉菜單並顯示模型數據,如名稱和類別等。

每次我回發到相同視圖時,出現錯誤聲明「沒有包含'IDNumbers'鍵的'IEnumerable'類型的ViewData項。」在PostView中。

回答

1

首先的

的原因「有型‘的IEnumerable’具有關鍵 ‘IDNumbers’沒有ViewData的項目。」

因爲,這DROPDOWNLIST將ViewBag/ViewData的數據綁定與名稱= "IDNumbers"

在你的[發佈]行動,沒有Viewbag.IDNumbers! =>所以這就是你得到這個錯誤的原因。

解決辦法:

1.Redirect爲[GET] ProductById收到數據後。

[HttpGet] 
public ActionResult ProductById(int iMyCode) 
{ 
    ViewBag.IDNumbers = ddlItems;//set your default value here 
    return View(); 
} 

2.Reload你的頁面與URL Query String,而不是提交表單。

3.在Javascript端設置您的默認值(下拉列表),通過AJAX從服務器獲取您的添加數據。通過Cookie /會話/查詢字符串存儲這些值。

我希望這將有助於

+0

謝謝@hungdoan。雖然#2和#3有助於未來的參考,但它不能解決我在顯示返回的產品的同一頁面上的問題。這是非常基本的沒有數據庫支持(使用ProductList類來模擬數據庫)我試着檢查模型是否爲null,如@if(!(Model.Equals(null))),但這只是引發異常,檢查模型。有什麼建議麼? – jbolt 2013-02-19 14:44:42

+0

你與模型數據就像回到自己的看法: '返回查看(邁德特);',然後綁定模型的數據類型通過這種方式:'@model string'(在你的[查看[.cshtml,..)。或者你可以綁定你的數據到ViewBag(這將更容易檢查空值) – hungdoan 2013-02-19 15:14:33

0

問題與你的例子:

  1. 不知道你想達到什麼目的,但它看起來像你停留在ASP.NET Web窗體「回傳」的模式。每次DDL更改時無需提交表單。更好的方法是通過AJAX將產品ID傳遞給服務器,並對響應進行處理。請使用FormCollection。使用ViewModel並綁定到您的視圖中,然後將其作爲[HttpPost]操作方法中的參數接受。
  2. 請勿使用@Html.DropDownList,請使用@Html.DropDownListFor(model => model.SomeDDl),其中SomeDddl將在您的ViewModel(與上述相關的2)上屬於SelectList類型的屬性。

因此,也許可以解釋你正在努力實現的目標,而我(和其他人)可以提供進一步的幫助。

+0

感謝您的快速響應。不幸的是,我一定不會使用ViewModel(目前)。我期望做的是將下拉列表中的查找結果與下拉列表一起放在同一頁面上(或出現時),以便第一次訪問該頁面時,您只能看到下拉列表,並在選擇某個產品後從下拉列表中顯示在下拉列表下方。 – jbolt 2013-02-19 01:32:50

0

這是因爲你使用ViewBag來存儲您的下拉列表值。

相反,如果您使用模型屬性來綁定Dropdownlist,即使發佈數據時也沒有辦法丟失DropDownList數據,它會更好。

所以,答案就是在您的文章中只使用ViewBag.IDNumbers = ddlItems

[HttpPost] 
public ActionResult ProductById(FormCollection formdata) 
{ 
    ViewBag.IDNumbers = ddlItems; //Set the ViewBag items 
    string selected = formdata["IDNumbers"]; 
    int id = int.Parse(selected); 
    Product p = items.GetByID(id); 
    return View(p); 
} 
相關問題