Я имею следующие таблицы, созданные в моем SQL Server
:Как изменить отображаемый текст в представлении?
Create Table tblDepartment(
Id int primary key identity,
Name nvarchar(50)
)
Create table tblEmployee(
EmployeeId int primary key identity,
Name nvarchar(50) not null,
Gender nvarchar(10) not null,
City nvarchar(50),
DepartmentId int not null foreign key references tblDepartment(Id)
)
Как вы можете видеть,
DepartmentId
колонна вtblEmployee
является внешним ключом для столбцаtblDepartment
Id
. Это один-ко-многим: каждыйDepartment
может иметь многоEmployee
- Оба
tblDepartment
иtblEmployee
имеютName
колонка
Тогда в моем MVC
приложения, используя две таблицы, я автоматически генерировать следующие EmployeeDataModel.edmx
:
(Обратите внимание, что я заменю имя tblEmployee
с Employee
и tblDepartment
с Department
)
И, естественно, у меня есть следующие автоматически сгенерированные классы сущностей:
public partial class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public string City { get; set; }
public int DepartmentId { get; set; }
public virtual Department Department { get; set; }
}
public partial class Department
{
public Department()
{
this.Employees = new HashSet<Employee>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Employee> Employees { get; set; }
}
Сейчас, на мой Employee/Index.cshtml
View
главный <table>
выглядит следующим образом:
... using here
@model IEnumerable<Employee>
...
<table class="table" border="1">
<tr>
<th>@Html.DisplayNameFor(model => model.Name)</th>
<th>@Html.DisplayNameFor(model => model.Gender)</th>
<th>@Html.DisplayNameFor(model => model.City)</th>
<th>@Html.DisplayNameFor(model => model.Department.Name)</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>@Html.DisplayFor(modelItem => item.Name)</td>
<td>@Html.DisplayFor(modelItem => item.Gender)</td>
<td>@Html.DisplayFor(modelItem => item.City)</td>
<td>@Html.DisplayFor(modelItem => item.Department.Name)</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.EmployeeId }) |
@Html.ActionLink("Details", "Details", new { id = item.EmployeeId }) |
@Html.ActionLink("Delete", "Delete", new { id = item.EmployeeId })
</td>
</tr>
}
</table>
Обратите внимание, что в заголовках таблиц у меня есть два «имени»:
<th>@Html.DisplayNameFor(model => model.Name)</th>
....
<th>@Html.DisplayNameFor(model => model.Department.Name)</th>
Что бы отображали «Имя», с соответствующими именами столбцов tblEmployee
и tblDepartment
в базе данных.Я хочу, чтобы избежать этого, поэтому я создаю partial class
для Department
, чтобы отобразить tblDepartment
Name
в Department Name
:
[MetadataType(typeof(DepartmentMetaData))]
public partial class Department {
}
public class DepartmentMetaData {
[Display(Name="Department Name")]
public string Name { get; set;}
}
И это один успешна:
Но теперь у меня есть еще один View
: Employee/Create.cshtml
<div class="form-horizontal">
<h4>Employee</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Gender, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("Gender", new List<SelectListItem> {
new SelectListItem {Text="Male", Value="Male"},
new SelectListItem{Text="Female", Value="Female"}
}, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Gender, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.City, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.DepartmentId, "DepartmentId", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("DepartmentId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.DepartmentId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
И заметьте, что у меня есть поле для DepartmentId
с DropdownList
:
<div class="form-group">
@Html.LabelFor(model => model.DepartmentId, "DepartmentId", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("DepartmentId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.DepartmentId, "", new { @class = "text-danger" })
</div>
</div>
Так же, как для моего Employee/Index.cshtml
View
, на этот раз, я не хочу, чтобы отобразить DepartmentId
Label
в "DepartmentId"
, таким образом, создать еще один partial class
для Employee
в дисплей "DepartmentId"
в "Department Name"
:
[MetadataType(typeof(EmployeeMetaData))]
public partial class Employee {
}
public class EmployeeMetaData {
[Required]
public string Name { get; set; }
[Required]
public string Gender { get; set; }
[Required]
public string City { get; set; }
[Required]
[Display(Name="Department Name")] //here it is
public int DepartmentId { get; set; }
}
Но когда оказывается, мой Employee/Create.cshtml
View
еще показывает DepartmentId
как его Label
:
Почему это так? Как я могу показать Label
как Department Name
тоже?
Примечание: все Views
(Index
и Create
) будут автоматически генерироваться при создании EmployeeController
с опцией Строительные леса: MVC5 Controller with views using Entity Framework
Я использую Entity Framework 6.1.1
и VS2013
, если они имеют значение.
использование DataAnnotations для отображения имен собственных – rashfmnb
@rashfmnb я добавил, что в моем 'частичной class', как для' 'Employee' и Department' до сих пор проблема не решена. Есть идеи? Я не понимаю, что он отлично работает в моем «Index'' View» (когда я добавляю атрибут Display для моего свойства 'Department'' Name'), но он не работает в моем представлении 'Create'' '(даже после того, как я добавил атрибут Display для моего свойства Employee' DepartmentId') – Ian
вы пробовали '@ Html.DisplayFor (modelItem => item.DepartmentId)' insted of '@ Html.LabelFor (model => model.DepartmentId, "DepartmentId", htmlAttributes: new {@class = "control-label col-md-2"}) ' – thepanch