2016-03-31 3 views
1

Я имею следующие таблицы, созданные в моем 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) 
) 

Как вы можете видеть,

  1. DepartmentId колонна в tblEmployee является внешним ключом для столбца tblDepartmentId. Это один-ко-многим: каждый Department может иметь много Employee
  2. Оба tblDepartment и tblEmployee имеют Name колонка

Тогда в моем MVC приложения, используя две таблицы, я автоматически генерировать следующие EmployeeDataModel.edmx:

enter image description here

(Обратите внимание, что я заменю имя 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.cshtmlView главный <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, чтобы отобразить tblDepartmentName в Department Name:

[MetadataType(typeof(DepartmentMetaData))] 
public partial class Department { 
} 

public class DepartmentMetaData { 
    [Display(Name="Department Name")] 
    public string Name { get; set;} 
} 

И это один успешна:

enter image description here

Но теперь у меня есть еще один 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.cshtmlView, на этот раз, я не хочу, чтобы отобразить DepartmentIdLabel в "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.cshtmlView еще показывает DepartmentId как его Label:

enter image description here

Почему это так? Как я могу показать Label как Department Name тоже?

Примечание: все Views (Index и Create) будут автоматически генерироваться при создании EmployeeController с опцией Строительные леса: MVC5 Controller with views using Entity Framework

Я использую Entity Framework 6.1.1 и VS2013, если они имеют значение.

+0

использование DataAnnotations для отображения имен собственных – rashfmnb

+0

@rashfmnb я добавил, что в моем 'частичной class', как для' 'Employee' и Department' до сих пор проблема не решена. Есть идеи? Я не понимаю, что он отлично работает в моем «Index'' View» (когда я добавляю атрибут Display для моего свойства 'Department'' Name'), но он не работает в моем представлении 'Create'' '(даже после того, как я добавил атрибут Display для моего свойства Employee' DepartmentId') – Ian

+1

вы пробовали '@ Html.DisplayFor (modelItem => item.DepartmentId)' insted of '@ Html.LabelFor (model => model.DepartmentId, "DepartmentId", htmlAttributes: new {@class = "control-label col-md-2"}) ' – thepanch

ответ

3
@Html.LabelFor(model => model.DepartmentId, "DepartmentId", 
           htmlAttributes: new { @class = "control-label col-md-2" }) 

Если просто

@Html.DisplayNameFor(model => model.DepartmentId, 
           htmlAttributes: new { @class = "control-label col-md-2" }) 

Или

@Html.LabelFor(model => model.DepartmentId, 
           htmlAttributes: new { @class = "control-label col-md-2" }) 
+0

Это правильный ответ. Я создаю его автоматически с помощью лесов, поэтому я этого не понимаю. Благодарю. – Ian

1

Ваш LabelFor для ниспадающего управления имеет дополнительный параметр, "DepartmentID", перекрывая отображаемое имя. Удаление, которое должно работать.

<div class="form-group"> 
    @Html.LabelFor(model => model.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> 
Смежные вопросы