在mvc 3 edmx模型中使用属性属性

时间:2011-11-16 11:41:36

标签: asp.net-mvc-3

我目前正在MVC 3中构建我的第一个项目,通过遵循微软提供的教程和视频,我发现它非常简单。然而,尽管我对这个主题进行了全部阅读,但还是有一件事情。我没有抓住。

使用属性控制大量功能,例如。显示名称,验证数据等,在您手写的代码中,只需在类声明上方的[]标签中键入属性,就可以在类属性上使用这些代码。就那么简单。在我称为用户的主要课程上,例如使用:

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

问题是我选择使用edmx模型在设计器中构建我的类(或实际上它是通过从数据库更新构建的)。这意味着代码文件是自动生成的,所以如果我在那里键入我的属性标签,一旦我更新模型,它们就会被覆盖。我在哪里添加这些?

这应该是一个常见的问题,但我似乎找不到合适的解决方案。

2 个答案:

答案 0 :(得分:3)

您必须在引用自动生成的类的不同文件中创建分部类。这就是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 :(得分:1)

你应该创建一个视图模型,并在那里有属性:

所以你会有一个名为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)