0

这是我第一次使用 MVC,也是第一次编写 Web 应用程序。

到目前为止,我设法获得了一个员工列表视图和一个 Employee 模型的编辑视图。

如果我需要将 25 个模型显示为列表并进行编辑,我是否必须创建 50 个不同的视图?

或者有没有办法拥有一个通用的列表视图和一个通用的编辑视图?

(下面编辑)

解决了列表视图问题。抱歉,代码太长了。

我创建了一个描述模型属性的ModelPropertyInfo类。现在我只添加了标签,但我可能会添加更多属性,如“格式”、“输入类型”……

// 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类。此类将能够通过将其名称作为字符串传递来从类中获取任何属性值

// 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);
    }
}

现在,这是我的Employee模型类

[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>

仍然停留在一个常见的编辑视图上,任何帮助将不胜感激。

再次,很抱歉长时间的编辑。

4

5 回答 5

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.

您可以在此处查看有关该主题的帖子

于 2013-05-22T02:40:45.567 回答
0

我建议你对每个模型对象都有这个结构:

  1. ListView:显示项目列表。并为视图中的每个项目创建一个视图模型类
  2. CreateView:创建新对象时使用。为此也有 ViewModel 类
  3. EditView:与 CreateView 相同,只是用于编辑模式

这种结构将使用 ViewModel 创建许多看起来相似的视图。但是,它们不是,因为它们在性质上因不同的目的而不同。该结构将在关注分离方面改进代码,有助于维护。易于使用。

于 2013-05-22T02:42:49.500 回答
0

结帐Knockout.js。我已经编写了像您所说的那样的应用程序,用于数据集合的视图和用于编辑单个记录的视图。淘汰赛使得将视图的编辑部分集成到集合视图中变得相当容易。对 WPF 和 Silverlight 样式数据绑定有所了解确实有帮助。我的所有视图现在都使用了敲除,并且我使用与编辑器区域的可见绑定将集合视图中的编辑功能与适当的数据绑定集成在一起。

于 2013-05-22T02:45:49.823 回答
0

您的视图将使用模型来显示或编辑数据。如果你有 25 个不同的模型,每个视图都应该有不同的模型。如果您只想使用一种模型,主要是因为它们具有相似的属性,则可以这样做,但并不理想。可以做到的方法是,如果所有模型都具有相似的属性,您可以将所有属性包含在一个模型中。然后您可以在其他视图中使用您需要的属性。这不是理想的做法。每个视图都应该有自己的模型。

于 2013-05-22T02:45:54.517 回答
0

您可以创建某种类,为您在应用程序中需要的所有不同类型的“表单输入”生成 html。然后向类添加从模型接收数据的能力(即,从模型中获取一个字符串并创建一个 TEXT 输入,并将值设置为该字符串 .... 或者 SELECT 下拉菜单可以从模型接收所有它的选项, ETC)。

然后,所有这些表单输入都可以从模型中生成(利用您的类),并且可以泵入一个传递给您的单个视图的数组中。该视图将包含所有周围的 div 和其他 html,但在视图中的某处,您将放置一个小的“for 循环”来输出数组的内容。这是有效的 MVC,因为您只在视图中使用了一个简单的 for 循环。并且您的模型在某种程度上可能部分负责决定数据如何格式化从数据库中出来(在这种情况下,表单输入)。要设置表单输入的样式,您可以将样式保存在 css 文件中或视图顶部。

最终,这取决于您的应用程序的未来。如果您的应用程序和模型适合一个很好的重复结构,这是一个想法。但是,如果您怀疑您的应用程序的某些部分可能会发展,有时您可能需要一个看起来完全不同的视图,或者您希望更好地控制如何在视图中排列每个生成的“表单输入”,那么您可能会创建更多的观看次数。

于 2013-05-22T02:53:00.667 回答