【问题标题】:MVC: What is a good way to pass column names to the view? [duplicate]MVC:将列名传递给视图的好方法是什么? [复制]
【发布时间】:2015-08-25 21:37:08
【问题描述】:

我想在我的视图上有一个空表,并根据用户的一些下拉列表选择使用 AJAX 填充它。我的模型包含下拉列表的数据。由于表头没有改变,我希望它静态地在视图上。我想知道传递给要在@Html.DisplayNameFor() 中使用的视图列名称的好方法是什么。当然,我可以传递一条记录并从中检索名称,例如

@Html.DisplayNameFor(model => model.Employees[0].LastName)

但在我看来,这很尴尬。我想避免将数据发送到视图,因为表最初是空的,所以不使用数据本身。你能建议一个更优雅的方式吗? 谢谢。

【问题讨论】:

  • 感谢您的回答。在我看来,它并不完全相同。在那个问题中,数据本身被传递给了视图,如果可能的话,这是我想避免的。
  • 这完全是同一个问题。建议的解决方案是创建自定义 html 帮助程序。但是,我认为没有必要为这么简单的事情创建一个 html 助手。您的问题有效。
  • 我知道它有效,但我想避免向我的视图发送不需要的数据。我只需要列名。
  • 什么意思?您希望避免发送到 View 数据的哪些内容?
  • 正如我在问题中提到的,例如表格员工最初是空的。只有它的标题存在。所以在我看来,发送一条数据记录只是为了从中获取列名似乎很奇怪。

标签: asp.net-mvc html-helper razorengine


【解决方案1】:

实际上,它比这更直接。 MVC 对此非常聪明,即使您的列表中没有条目,以下代码也将起作用:

@Html.DisplayNameFor(model => model.Employees.First().LastName)

【讨论】:

  • 它与我的答案不同吗? :) 我什至不需要指定 .First()
  • 有点,是的。因为您在列表中指定了一个索引,所以它会尝试评估它,所以如果您有一个空列表,它会翻倒。使用First(),MVC 很聪明,可以说“是的,随便,只要给我名字”
  • 你说的是我最初的问题,但我比你早 9 分钟回答了。 :) 你可以看到我根本没有实例化任何东西,但我有我的元数据。而不是 EmployeeViewModel 列表,我有一个 EmployeeViewModel 类型的成员,它包含我需要的所有元数据。
  • 啊,我明白你的意思了。是的,它们都会做同样的事情,在这一点上,这只是一个偏好问题。
【解决方案2】:

我找到了一个可行的解决方案,但我不确定它是否是最好的解决方案。 首先,在我的 ViewModel(即EmployeesViewModel)中,我添加了一个EmployeeViewModel 类型的成员:

public class EmployeeViewModel
{
        public int Id { get; set; }
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        public string Gender { get; set; }
        public int? Salary { get; set; }
        public int? DepartmentId { get; set; }
        [Display(Name = "Department Name")]
        public string DepartmentName { get; set; }
}

public class EmployeesViewModel
{
    public SelectList Departments { get; set; }
    public EmployeeViewModel EmployeeColumnNamesRetriever { get; set; }
}

在控制器中,我实例化了我的部门,但不是 EmployeeColumnNamesRetriever,因为我只需要它来获取其元数据:

        EmployeesViewModel employees = new EmployeesViewModel
        {
            Departments = new SelectList(db.Departments, "Id", "Name"),
        };

在视图中:

    <th>
        @Html.DisplayNameFor(model => model.EmployeeColumnNamesRetriever.FirstName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.EmployeeColumnNamesRetriever.LastName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.EmployeeColumnNamesRetriever.Gender)
    </th>

EmployeeColumnNamesRetriever 为空,但没关系。 如果有人能提出更好的建议,我将不胜感激。

【讨论】:

  • 如果给我的答案打负分的人能写出他(她)不喜欢的东西,或者提出更好的建议,那就太好了。否则它不是很有帮助。
猜你喜欢
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多