2013-07-15 20 views
1

我是新的MVC。我有一個代碼,它正要從控制器填充viewdata並傳遞給view。只是看看代碼。關於分配模型數據到文本框在asp.net MVC

控制器

public ActionResult Edit(int id) 
     { 
      ViewData["Name"] = "My name is XYZ"; 
      return View(); 
     } 

視圖頁面

@Html.TextBox("Name") 

我的問題是文本框怎麼理解提取姓名和顯示爲文本框的值。基本上名字被存儲在viewdata中。首先我們需要從viewdata中提取數據,然後我們可以將該數據分配給文本框作爲值。怎麼運行的 ?。

有人解釋,但事情對我來說並不

MVC設計有默認的協議,以尋找關鍵字,並設法使聯想到這些關鍵字很清楚。您已選擇使用「名稱」作爲臨時數據對象。然後,MVC將努力尋找具有相同名稱的任何元素。它相信您打算爲元素指定與您的ViewData對象相同的名稱,因爲您希望它關聯。

對於ViewBag也是如此。您可以給ViewBag一個名稱(ViewBag.Name),並且每當您爲某個元素使用「Name」時,MVC將自動假定您希望該元素與ViewBag數據關聯。這也適用於列表!

ViewBag.myList = db.Products.ToList(); 

@Html.DropDownList("myList"); 

我都懂MVC流不是很clear.i在MVC是新的。所以我正在閱讀mvc教程。在閱讀上述答案後,我不太容易理解。只是想想asp.net web表單。在asp.net web表單

如果我們存儲任何進入的視圖狀態或會話像這樣viewstate["Name"]="Mou" or session["Name"]="Mou"那麼我們就需要渲染在像這樣的客戶端是價值<asp:textbox value=<% name %>/>然後我會得到錯誤,但是,如果我們這樣寫方式<asp:textbox value=<% viewstate["Name"] as string %>/>那麼將工作。所以如何MVC可以理解,如果我們指定簡單@Html.TextBox("Name")

假設名稱可以存儲在會話,viewdata,viewbag,tempdata等,所以如何MVC引擎可以解決它?用更多的例子尋找好的解釋。 謝謝

回答

0

我的問題是如何將textbox理解爲提取名稱並將其顯示爲文本框的值。

這是所有的魔法字符串。您所放置Name鑰匙插入ViewData

ViewData["Name"] = "My name is XYZ"; 

所以當你使用@Html.TextBox("Name")助手將搜索ViewData的名稱,並自動綁定數據。

這很正常,這似乎讓你感到困惑。不要使用任何ViewBag/ViewData。改用視圖模型。這樣你將不再依賴任何魔術字符串。您將使用強類型助手。例如,讓我們假設你想綁定一些簡單的TextBox。來吧,爲它編寫視圖模型:

public class MyViewModel 
{ 
    public string Name { get; set; } 
} 

然後讓你的控制器動作通過這個模型的觀點:

public ActionResult Edit(int id) 
{ 
    var model = new MyViewModel(); 
    model.Name = "My name is XYZ"; 
    return View(model); 
} 

,最終使你的觀點強類型的模型,並使用強類型幫手:

@model MyViewModel 
... 
@Html.TextBoxFor(x => x.Name) 

你看,MVC的意思是模型/視圖/控制器。它並不意味着ViewData/View/Controller或ViewBag/View/Controller。所以很多人都混淆了這些縮寫,徹底擊敗了這種模式的目的。他們正在從不同來源向視圖提供數據,而不僅僅是從應該饋送信息的視圖模型。不要像那些人一樣。

既然你談到列表,再次書寫下是完全錯誤的:

@Html.DropDownList("myList") 

之所以這樣,是完全錯誤的,因爲爲了有一個下拉菜單,你需要在模型2個屬性:一個簡單的標量屬性,用於將選定的值綁定到集合屬性以綁定下拉列表中的可用值。

就像這樣:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Values { get; set; } 
} 

這是通常被填充在您的控制器:

public ActionResult Edit(int id) 
{ 
    var model = new MyViewModel(); 

    // this usually comes from a database 
    model.Values = new[] 
    { 
     new SelectListItem { Value = "1", Text = "item 1" }, 
     new SelectListItem { Value = "2", Text = "item 2" }, 
     new SelectListItem { Value = "3", Text = "item 3" }, 
    }; 

    // This allows to preselect the second value in the dropdown 
    model.SelectedValue = "2"; 

    return View(model); 
} 

,並在視圖:

@model MyViewModel 
... 
@Html.DropDownListFor(x => x.SelectedValue, Model.Values) 

所以我的建議是越早你忘了關於ViewData/ViewBag的更好。

+0

我有點混淆關於下拉綁定。你的MyViewModel有兩個屬性,一個是SelectedValue,另一個是值,所以你可以寫model.Value =「2」; ?有沒有名爲價值的屬性?你沒有展示如何使用SelectedValue屬性?如果可能請告訴我如何使用SelectedValue屬性。謝謝 – Thomas

+0

對不起,這是我的錯誤。它應該是'model.SelectedValue =「2」;'。我已經更新了我的答案以反映這一點。 –