Использование атрибутов свойств в модели mvc 3 edmx - PullRequest
2 голосов
/ 16 ноября 2011

В настоящее время я строю свой первый проект в MVC 3, который я нахожу довольно простым, следуя инструкциям и видео, предоставленным Microsoft. Однако есть одна вещь, которая, несмотря на все мои чтения по этому вопросу; Я не могу понять.

Огромное количество функций управляется с помощью атрибутов, например. отображаемое имя, данные проверки и т. д., и в вашем рукописном коде они используются в свойствах вашего класса, просто введя атрибут в тегах [] над объявлением класса. Просто как тот. В моем основном классе под названием «Пользователи» я использую:

[DisplayName("Password")]
[DataType(DataType.Password)]
public string Password { get; set; }

Проблема, однако, в том, что я решил построить свои классы в конструкторе, используя модель edmx (или фактически она создается путем обновления из базы данных). Это означает, что файлы кода генерируются автоматически, поэтому, если я введу туда свои теги атрибутов, они будут перезаписаны, как только я обновлю модель. Куда мне добавить это?

Это действительно должно быть обычной проблемой, но я не могу найти правильное решение.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Вам нужно будет создать частичный класс в другом файле, который ссылается на автоматически сгенерированный класс. Это одна из причин, почему EF Code First хорош - нет необходимости в дополнительном файле. Я использую EF DB First, что ставит меня в ту же лодку, что и вы. Вот один из способов сделать это (я уверен, что есть и другие):

Допустим, ваш сгенерированный EF класс называется Customer.

namespace YourNamespace
{
    public partial class Customer
    {   
        public string Password { get; set; }
    }
}

Создайте другой класс (я положил его в папку Models). Например, Customer_Model.cs:

using System.ComponentModel.DataAnnotations;

namespace YourNamespace
{
    [MetadataType(typeof(Customer_Attributes))]
    public partial class Customer
    {
        //define some functions here if you wish
    }

    public class Customer_Attributes
    {
        [DisplayName("Password")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
}
1 голос
/ 16 ноября 2011

Вы должны создать модель вида и иметь там атрибуты:

Таким образом, у вас будет новый класс с именем UserViewModel (или что-то еще)

public class UserViewModel
{
    public int Id {get;set;}

    [DisplayName("Password")]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DisplayName("User Name")]
    public string Name { get; set; }

    public UserViewModel(User user)
    {
        this.Id = user.Id;
        this.Password = user.Password;
        this.Name = user.Name;
    }

    public UserViewModel() { }
}

Затем вы можете отправить это в представление вместо вашего пользовательского объекта. Это также лучше, поскольку вы, возможно, не захотите использовать ВСЕ свойства для пользователя, и поэтому здесь вам нужно только отправить то, что вам нужно.

По запросу

Контроллер:

    public ActionResult Edit(int id)
    {
        //takes a user
        User user = this.UserRepository.GetById(id); 
        //maps to viewmodel by passing in a user ... see viewmodel above.
        var model = new UserViewModel(user);

        //returns a viewmodel not a user
        return View(model);
    }


    [HttpPost]
    public ActionResult Edit(UserViewModel model)
    {
        //check validation
        if (ModelState.IsValid)
        {
            // get the user
            User user = this.UserRepository.GetById(model.Id);
            //update the properties
            user.Name = model.Name;
            user.Password = model.Password;

            //redirect back to index or a success page if you prefer.
            return RedirectToAction("Index");
        }

        return View();
    }

Вид:

    @model ViewModels.User.UserViewModel
    @{
        ViewBag.Title = "Edit";
        Layout = "~/Views/Shared/MasterPages/_Layout.cshtml";
    }

    @Html.HiddenFor(x => x.Id)
    @Html.EditorFor(x => x.Name)
    @Html.EditorFor(x => x.Password)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...