Как мне указать, какое поле должно отображаться с помощью MVC Scaffolding

#entity-framework #asp.net-mvc-4 #ef-code-first #asp.net-mvc-scaffolding

#entity-framework #asp.net-mvc-4 #ef-code-first #asp.net-mvc-scaffolding

Вопрос:

Я создаю приложение MVC4, используя базу данных EF Code First. Я работаю с некоторыми объявлениями внешнего ключа. Я хочу использовать определение поля для отображения в выпадающем списке в строительных лесах в объявлениях моделей. Например:

Мое упрощенное объявление модели выглядит следующим образом:

 public class Contact
{
    public int ID { get; set; }
    public string Prefix { get; set; }
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; }
    public string FullName
    {
        get { return (Last   ", "   First   " "   Middle).Trim(); }
    }
}

public class Role
{
    public int ID { get; set; }
    public string RoleName { get; set; }
    public string RoleDescription { get; set; }
}

public class RoleAssignment
{
    [Key]
    public int ID { get; set; }

    [ForeignKey("Contact")]
    public int Contact_ID { get; set; }
    public virtual Contact Contact { get; set; }

    [ForeignKey("Role")]
    public int Role_ID { get; set; }
    public virtual Role Role { get; set; }
}
  

Я создаю стандартные строительные леса, и edit .cshtml выглядит следующим образом:

  <fieldset>
    <legend>RoleAssignment</legend>

    @Html.HiddenFor(model => model.ID)

    <div class="editor-label">
        @Html.LabelFor(model => model.Contact_ID, "Contact")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Contact_ID", String.Empty)
        @Html.ValidationMessageFor(model => model.Contact_ID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Role_ID, "Role")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Role_ID", String.Empty)
        @Html.ValidationMessageFor(model => model.Role_ID)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
  

Однако в раскрывающемся списке используется поле «Префикс» для выпадающего списка и отображения. Я хочу, чтобы оно использовало поле «Полное имя». Как мне указать это в объявлении модели Contact? (Я знаю, как это сделать, изменив код .cshtml, но я хочу, чтобы он работал с чистым сгенерированным кодом.)

Ответ №1:

ОК. Разобрался со всем этим. Чтобы указать пользовательское поле именования для вашей таблицы в раскрывающихся списках, используйте «DisplayColumn» в классе модели, а затем используйте атрибут «NotMapped», чтобы предотвратить отображение пользовательского поля отображения в базу данных, и дайте ему параметр настройки, который ничего не делает:

 [DisplayColumn("FullName")]
public class Contact
{
    public int ID { get; set; }

    [NotMapped]
    [Display(Name = "Full Name")]
    public string FullName
    {
        get { return (Last   ", "   First   " "   Middle).Trim(); }
    }
    public string Prefix { get; set; }
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; } }
  

Ответ №2:

У меня есть частичный ответ на мой вопрос:

Добавление атрибута «DisplayColumn» в класс модели позволяет изменить поле отображения для строительных лесов следующим образом:

 [DisplayColumn("First")]
public class Contact
{
    public int ID { get; set; }
    [Display(Name = "Full Name")]
    public string FullName
    {
        get { return (Last   ", "   First   " "   Middle).Trim(); }
    }
    public string Prefix { get; set; }
    public string First { get; set; }
}
  

Однако это не работает с полем «Полное имя», доступным только для чтения. Все еще пытаюсь это выяснить…

Комментарии:

1. Это работает, вам просто нужно добавить [NotMapped] потому что да, это не столбец в вашей базе данных