【问题标题】:MVC 4 Views, common or specific?MVC 4 视图,常见的还是特定的?
【发布时间】:2013-05-22 13:37:59
【问题描述】:

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

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

如果我需要将 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 类,我的所有模型都将继承。此类将能够通过将其名称传递为 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);
    }
}

现在,这是我的 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>

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

再次抱歉,编辑太长了。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案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

    【讨论】:

    • ContentFor(Model.Employee)?
    • 模型是 Employee 类型的,所以我认为您的意思类似于 @Html.ContentFor(Employee.Name)。而且我无法在任何地方对 ContentFor Html 助手进行微调。
    • 对不起,伙计们。我的意思是@Html.ContentFor(Model)
    【解决方案2】:

    我建议您为每个模型对象都采用这种结构:

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

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

    【讨论】:

    • 我设法创建了一个可以显示任何类型的模型对象的列表视图。检查我的编辑。仍然必须弄清楚编辑和创建视图。我猜要困难得多。
    • 我知道你的意思,我以前用 ASP.NET 做过类似的事情。然而,当对象类型增加时,特别是当我们需要为每种类型提供的自定义规则/操作时,它引起了我的头痛。这就是为什么我建议你这样做
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-03
          • 2012-08-16
          • 1970-01-01
          • 2012-06-01
          • 2019-04-22
          相关资源
          最近更新 更多