2013-08-29 45 views
3

現在,如果我知道它的名稱和價值,我可以顯示和更新一個模型。例如,這裏是我的學生模型:如何在mvc中動態顯示模型的屬性?

public class Student 
{ 
    public string Name { get; set; } 
    public bool Sex { get; set; } 
    public bool Address { get; set; } 
} 

而且,這裏是我有我的觀點:

@Html.TextBoxFor(model => model.Name) 
@Html.TextBoxFor(model => model.Sex) 
@Html.TextBoxFor(model => model.Address) 

我要顯示和更新的模式,但我不知道有多少它具有的屬性以及它們的名稱和值是什麼。例如,如果我將Fruit模型返回給視圖,則需要顯示並更新其屬性,如Price或Weight。如果我返回一個學生模型,我需要顯示和更新屬性,如姓名,性別和地址。我的項目中有十多個模型。我的老闆說我可以像這樣用Dictionary<string,string>這樣的關鍵字和值,並遍歷模型屬性,但我不知道該怎麼做。

+0

讓我試着理解你的問題。您是否基本上試圖將2個模型發送到視圖,以便您可以更新或? –

+0

所以澄清:你想要1視圖,可以處理編輯多個模型?通常你會創建10個視圖,每個模型一個視圖。然而,你可以通過循環反射模型的屬性並根據類型寫出不同的控件(bool = checkbox,string = textbox等)來實現你正在嘗試做的事情。您還可以創建一個包含模型,該模型調用一個方法來確定支持哪些字段以及如何顯示它們。你試圖做的事情是相當複雜的,可能會矯枉過正,以避免寫出10個不同的觀點。 – Adam

+0

http://www.gregshackles.com/2010/09/anonymous-view-models-in-asp-net-mvc-using-dynamics/ –

回答

1

下面是一個簡單的例子,展示瞭如何使用動態模型來做到這一點。

首先,我設置了幾個類來表示你上面提供的模型中的不同的例子:

public class Student 
{ 
    public string Name { get; set; } 
    public string Sex { get; set; } 
    public string Address { get; set; } 
} 

public class Fruit 
{ 
    public decimal Price { get; set; } 
    public decimal Weight { get; set; } 
} 

接着,我創建每種類型一個DisplayTemplate,像這樣:

@model Fruit 

<p>Fruit template</p> 

@Html.DisplayFor(m => m.Price) 
@Html.DisplayFor(m => m.Weight) 

@model Student 

<p>Student template</p> 

@Html.DisplayFor(m => m.Name) 
@Html.DisplayFor(m => m.Sex) 
@Html.DisplayFor(m => m.Address) 

現在是有趣的部分。我創建了一個視圖模型保持動態模型,同時還提供場拿到底層模型的類型:

public class ViewModel 
{ 
    public dynamic Model { get; set; } 
    public Type ModelType { get; set; } 
} 

這允許我們做兩件事情:

  1. 要指定一個任意類型到Model
  2. 使用ModelType作爲控制應該爲模型調用哪個DisplayTemplate的方法。

因此,你的觀點看起來像下面這樣:

@model ViewModel 

@Html.DisplayFor(m => m.Model, Model.ModelType.ToString()) 

正如你可以看到,這個過載的Html.DisplayFor允許我們指定的模板名稱,這是第二個參數代表什麼。

最後,我創建了一個快速操作方法來測試這個。

首先,爲Student類型:

public ActionResult Index() 
{ 
    var model = new ViewModel(); 
    model.ModelType = typeof(Student); 
    model.Model = new Student { Name = "John", Sex = "Male", Address = "asdf" }; 

    return View(model); 
} 

其次,對於Fruit類型:

public ActionResult Index() 
{ 
    var model = new ViewModel(); 
    model.ModelType = typeof(Fruit); 
    model.Model = new Fruit { Price = 5, Weight = 10 }; 

    return View(model); 
} 

兩者,得到所需的輸出。