这是我第一次使用MVC,也是第一次编写Web应用程序。
到目前为止,我设法查看了员工列表,以及Employee模型的编辑视图。
如果我有25个模型需要显示为列表并进行编辑,我是否需要创建50个不同的视图?
或者有没有办法让一个公共列表视图和一个常见的编辑视图?
(编辑如下)
解决了列表视图问题。 抱歉,长代码。
我创建了一个描述模型属性的 ModelPropertyInfo 类。现在我只添加了Label,但我可能会添加更多属性,如“Format”,“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; }
}
我的所有模型都将继承的 ModelBase 类。通过将其名称作为 string
传递,该类将能够从类中获取任何属性值。// 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
中的Index方法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>
仍然停留在常见的编辑视图中,我们将不胜感激。
再次,抱歉长时间编辑。
答案 0 :(得分: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
答案 1 :(得分:0)
我建议你为每个模型对象都有这个结构:
此结构将使用看起来相似的ViewModel创建许多视图。然而,它们并不是因为在性质上它们因不同目的而不同。该结构将在关注分离方面改进代码,有助于维护。易于使用。
答案 2 :(得分:0)
结帐Knockout.js。我编写了类似于您所讨论的应用程序,数据集合视图和编辑单个记录的视图。 knockout使得将视图的编辑部分集成到集合查看中相当容易。它有助于理解WPF和Silverlight样式数据绑定。我的所有视图现在都使用knockout,我使用可见的绑定编辑区域,将集合视图中的编辑功能与正确的数据绑定集成在一起。
答案 3 :(得分:0)
您的视图将使用模型显示或编辑数据。如果您有25个不同的模型,则每个视图都应具有不同的模型。 如果你只想使用一个模型,主要是因为它们共享相似的属性,这可以做到,但它并不理想。可以这样做的方法是,如果所有模型都具有相似的属性,则可以在一个模型中包含所有属性。然后,您可以在其他视图中使用所需的属性。这不是理想的做法。每个视图都应该有自己的模型。
答案 4 :(得分:0)
您可以创建某种类,为您在应用中需要的所有不同类型的“表单输入”生成html。然后为类添加从模型接收数据的能力(即从模型中获取一个字符串并创建一个TEXT输入,其值设置为该字符串....或者SELECT下拉列表可以从模型中接收所有它的OPTION),等等)。
然后,所有这些表单输入都可以在模型中生成(使用您的类),并且可以被泵入一个传递给您的单个视图的数组中。该视图将包含所有周围的div和其他html,但在视图的某处,您将放置一个小的“for循环”,输出您的数组的内容。这是有效的MVC,因为您只在视图中使用简单的for循环。并且您的模型在某种程度上可能部分负责决定如何格式化数据如何从数据库中出来(在这种情况下,表单输入)。要设置表单输入的样式,可以将样式保存在css文件中或视图的顶部。
最终取决于您应用的未来。如果您的应用和模型适合一个漂亮的重复结构,这是一个想法。但是,如果您怀疑应用程序的某些部分可能会发生变化,有时您可能需要一个视图看起来有很大不同,或者您希望更多地控制如何在视图中安排每个生成的“表单输入”,那么您可能会创建更多的观点。