下面是一個簡單的例子,展示瞭如何使用動態模型來做到這一點。
首先,我設置了幾個類來表示你上面提供的模型中的不同的例子:
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; }
}
這允許我們做兩件事情:
- 要指定一個任意類型到
Model
。
- 使用
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);
}
兩者,得到所需的輸出。
讓我試着理解你的問題。您是否基本上試圖將2個模型發送到視圖,以便您可以更新或? –
所以澄清:你想要1視圖,可以處理編輯多個模型?通常你會創建10個視圖,每個模型一個視圖。然而,你可以通過循環反射模型的屬性並根據類型寫出不同的控件(bool = checkbox,string = textbox等)來實現你正在嘗試做的事情。您還可以創建一個包含模型,該模型調用一個方法來確定支持哪些字段以及如何顯示它們。你試圖做的事情是相當複雜的,可能會矯枉過正,以避免寫出10個不同的觀點。 – Adam
http://www.gregshackles.com/2010/09/anonymous-view-models-in-asp-net-mvc-using-dynamics/ –