2015-06-23 2 views
2

Я новичок в среде MVC. Я использую DB-текст сущностей для выполнения операции, связанной с базой данных. Я делаю так Entityframework -> dbcontext -> Модель -> Контроллер -> Просмотр. Я непосредственно привязываю модель для просмотра. например есть имя таблицы UserProfile, и я создал модель с тем же именем и colum как свойство Model. Я собираю запись записей с Userprofile и привязываю эту коллекцию непосредственно к View. Вот модельЛучшая практика для MVC в .net C#

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    [DisplayName("ID")] 

    public long UserId { get; set; } 
    private string _UserName; 
    public string UserName 
    { 
     get { return _UserName; } 
     set { _UserName = value; } 

    } 
    public string Thalassemic 
    { 
     get; 
     set; 
    } 

    [Display(Name = "Your First Name")] 
    [Required(ErrorMessage = "First Name is Required.")] 
    [StringLength(30, ErrorMessage = "First Name must be {2}-{1} to long", MinimumLength = 2)] 
    [RegularExpression("^[a-zA-z ]+$", ErrorMessage = "First name must contain only characters")] 
    public string FirstName { get; set; } 

    [Display(Name = "Your Last Name")] 
    [Required(ErrorMessage = "Last Name is Required.")] 
    [RegularExpression("^[a-zA-z ]+$", ErrorMessage = "Only characters are allowed.")] 
    [StringLength(20, ErrorMessage = "First Name must be {2}-{1} to long", MinimumLength = 2)] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Email Address is Required.")] 
    [StringLength(250, ErrorMessage = "{0} must be {2}-{1} to long", MinimumLength = 4)] 
    [Display(Name = "Email Address")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid email-address.")] 
    [RegularExpression("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$", ErrorMessage = "Please enter a valid email-address.")] 
    //todo: re-think about updating email address as we are user email as login id and this can't change 
    public string Email { get; set; }} 

Должен ли я использовать этот объект DTO для привязки данных с точки зрения

public class UserProfileDTO 
{ 
    public long UserId { get; set; } 
    private string _UserName; 
    public string UserName 
    { 
     get { return _UserName; } 
     set { _UserName = value; } 
    } 
    public string Thalassemic 
    { get; 
     set; 
    } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 

на основе выше, я хочу знать, что это правильный метод? если нет, то что лучше?

+1

Вообще лучше использовать модель представления для зрения - [Что такое ViewModel в MVC] (http://stackoverflow.com/questions/11064316/what- is-viewmodel-in-mvc) –

ответ

3

Использование базы данных Классы POCO в качестве модели обычно обескуражены в MVC вместо моделей просмотра, содержащих только те данные, которые необходимы для представления. Представьте, у вас есть User запись с полями 30+, но вы только хотите, чтобы отобразить Username, вы можете просто создать UsernameViewModel:

public class UsernameViewModel 
{ 
    public string Username { get; set; } 
} 

Это намного чище, потому что вы только отправка клиенту поля, которые вы необходимость.

+0

@matytommo, спасибо за ответ, но это не мой вопрос. У меня есть вопрос обновления для лучшего уточнения. Я просто хочу узнать о полной привязке модели EF к просмотру - хорошая идея или нет? –

+1

@TarsemSingh Это ** есть ** ответ на этот вопрос :). Вы не должны использовать классы EF в представлении, это рекомендуется. – mattytommo

+0

Это означает, что я должен использовать класс DTO для привязки к представлению. правильно ? если это правильно, то можете ли вы рассказать мне, что является минусом для прямой привязки модели к просмотру. –

0

Как сказал @mat, не рекомендуется использовать классы POCO непосредственно в представлениях. Не рекомендуется, так как пользователь никогда не сможет изменять значения POCO, а также, что происходит, когда вы хотите показать пользователю более одного POCO? (Я надеюсь, что ваш ответ не «Изменить POCO для удовлетворения запросов пользователей»).

Кроме того, если ваше приложение является n-ярусом, настоятельно рекомендуется использовать некоторые DTO для передачи данных между слоями.

В качестве предложения и преимущества использования класса DTO вы можете проверить по ссылке MSDN here или, как демо-части, есть хороший учебник о том, что использовать в зависимости от ваших требований к CodeProject here.

Подробнее о StackOverflow о вашем вопросе here