2013-05-22 36 views
0

這是我第一次使用MVC,第一次編寫Web應用程序。MVC 4意見,共同還是特定?

到目前爲止,我設法看到員工列表以及Employee模型的編輯視圖。

如果我有25個模型需要顯示爲列表並進行編輯,我將不得不創建50個不同的視圖?

還是有辦法讓一個共同的列表視圖和一個常見的編輯視圖?

(編輯如下)

解決了列表視圖問題。 對不起,長碼。

我創建了一個描述模型屬性的類ModelPropertyInfo類。現在我只加了標籤,但我可能會增加更多的屬性,如「格式」,「的inputType」,...

// Model field information class. Used by views to display model info properly 
public class ModelPropertyInfo 
{ 
    public ModelPropertyInfo() { } 

    public string Name { get; set; } 
    public string Label { get; set; } 

} 

然後ShowInListAttribute屬性類,裝飾,我想只出現模特屬性在列表視圖

// Attribute class used to specify Labels for model fields 
public class ShowInListAttribute : Attribute 
{ 
    public ShowInListAttribute(string header) 
    { 
     Header = header; 
    } 

    public string Header { get; set; } 
} 

而一個模型庫類,我的所有車型都將繼承。本課程將給予通過將它的名字爲字符串

// Base class for all models 
public class ModelBase 
{ 
    public static List<ModelPropertyInfo> ModelProperties(Type modelType) 
    { 
     List<ModelPropertyInfo> result = new List<ModelPropertyInfo>(); 
     foreach (PropertyInfo pi in modelType.GetProperties()) 
     { 
      ShowInListAttribute att = (ShowInListAttribute)pi.GetCustomAttributes(typeof(ShowInListAttribute), true).FirstOrDefault(); 
      if (att != null) 
       result.Add(new ModelPropertyInfo { Label = att.Header, Name = pi.Name }); 
     } 
     return result; 
    } 

    public object GetPropertyValue(string propName) 
    { 
     return this.GetType().GetProperty(propName).GetValue(this, null); 
    } 
} 

我們得到的類中的任何屬性值的能力,這是我員工模型類

[Table("Employee")] 
public class Employee : ModelBase 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public decimal ID { get; set; } 

    [ShowInList("First Name")] 
    public string FirstName { get; set; } 

    [ShowInList("Last Name")] 
    public string LastName { get; set; } 

    public decimal DepartmentID { get; set; } 

    [ShowInList("Department")] 
    [DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)] 
    public string DepartmentName { get; set; } 
} 

所以,把所有上面的使用,這裏的索引方法在我的EmployeeController

public ActionResult Index() 
{ 
    ViewBag.Columns = ModelBase.ModelProperties(typeof(Employee)); 
    ViewBag.Title = "Employee List"; 
    return View("ListShared", db.Employees.ToList()); 
} 

最後的結果,我會用它來顯示任何模型的列表SharedListView我想

@using SharedListView.Models 

@model IEnumerable<ModelBase> 



<h2>@ViewBag.Title</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     @foreach (ModelPropertyInfo col in ViewBag.Columns) 
     { 
      <th> 
       @col.Label 
      </th> 
     } 
     <th></th> 
    </tr> 

    @foreach (var item in Model) { 
     <tr> 
      @foreach (ModelPropertyInfo col in ViewBag.Columns) 
      { 
       <td width='100px'> 
        @item.GetPropertyValue(col.Name).ToString() 
       </td> 
      } 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id=item.GetPropertyValue("ID") }) | 
       @Html.ActionLink("Details", "Details", new { id=item.GetPropertyValue("ID") }) | 
       @Html.ActionLink("Delete", "Delete", new { id=item.GetPropertyValue("ID") }) 
      </td> 
     </tr> 
    } 
</table> 

仍然停留在一個共同編輯觀點,任何幫助,將不勝感激。

再次,對於長編輯抱歉。

回答

1

你不需要那樣做。 ASP.NET MVC支持ContentFor方法和EditorFor方法。所以你的情況,你只需要在設計視圖模型,事後對你的看法,你可以使用它像

@Html.ContentFor(Model.Employee) // for display - that mean, it should be read-only 
@Html.EditorFor(Model.Employee) // for editing. 

你可以看到關於該主題的帖子here

+0

ContentFor(Model.Employee)? – gush

+0

模型是Employee類型的,所以我認爲你的意思就像@ Html.ContentFor(Employee.Name)。我無法在任何地方罰款ContentFor Html助手。 – gush

+0

對不起。我的意思是@ Html.ContentFor(Model) – thangchung

0

我建議你此結構適用於每個模型對象:

  1. ListView:顯示項目列表。併爲視圖中的每個項目創建一個視圖模型類
  2. CreateView:創建新對象時使用。也有ViewModel類此
  3. EditView中:同CreateView的,但它是爲編輯模式

這種結構將創建一個視圖模型看起來類似的許多看法。然而,他們不是因爲性質不同而有不同的目的。該結構將在關注點分離方面改善代碼,有助於維護。易於使用。

+0

我設法創建了一個列表視圖,可以顯示任何類型的任何模型對象。檢查我的編輯。仍然必須弄清楚編輯和創建視圖。我猜更難了。 – gush

+0

我知道你的意思,我之前用ASP.NET做過類似的事情。然而,當對象類型增長時,它引起了我的頭痛,特別是當我們需要爲每種類型提供的自定義規則/動作時。這就是爲什麼我這樣建議你 –

0

結帳Knockout.js。我已經編寫了應用程序,例如您正在討論的內容,用於收集數據的視圖以及用於編輯單個記錄的視圖。淘汰賽使得將視圖的編輯部分集成到集合查看中相當容易。它有助於理解WPF和Silverlight樣式的數據綁定。我現在所有的視圖都使用了knockout,並且我使用可見的綁定將編輯功能集成到了編輯器區域,並將集合視圖中的編輯功能與正確的數據綁定結合在一起

0

您的視圖將使用模型來顯示或編輯數據。如果你有25個不同的型號,每個視圖應該有不同的型號。 如果您只想使用一個模型,主要是因爲它們具有相似的屬性,可以這樣做,但這並不理想。可以完成的方式是,如果所有模型具有相似的屬性,則可以在一個模型中包含所有屬性。然後你可以在其他視圖中使用你需要的屬性。這不是做這件事的理想方式。每個視圖都應該有自己的模型。

0

您可以創建一些類,爲您的應用程序需要的所有不同類型的「表單輸入」生成html。然後添加能力給類從模型接收數據(即從模型中獲取一個字符串並創建一個TEXT輸入,其值設置爲該字符串....或者一個SELECT下拉菜單可以接收來自模型的所有OPTION,等等)。

然後,所有這些表單輸入都可以從模型中生成(利用您的類),並可以被傳送到傳遞給您的單個視圖的數組中。該視圖將包含所有周圍的div和其他html,但視圖中的某處會放置一個輸出數組內容的小型「for循環」。這是有效的MVC,因爲你只在視圖中使用簡單的for循環。而且在某種程度上,您的模型可能在決定數據從數據庫中如何格式化(在這種情況下爲表單輸入)方面負有部分責任。要設置表單輸入的樣式,您可以將樣式保留在css文件中或視圖的頂部。

最終取決於您的應用程序的未來。如果你的應用和模型適合一個很好的重複結構,這是一個想法。但是,如果你懷疑你的應用程序的部分可能演變,其中有時你可能需要爲了看起來更不同,或者你想對你如何安排各的看法產生的那些「表單輸入」更多的控制,那麼你可能會創建更多的意見。