我目前正在MVC 3中构建我的第一个项目,通过遵循微软提供的教程和视频,我发现它非常简单。然而,尽管我对这个主题进行了全部阅读,但还是有一件事情。我没有抓住。
使用属性控制大量功能,例如。显示名称,验证数据等,在您手写的代码中,只需在类声明上方的[]标签中键入属性,就可以在类属性上使用这些代码。就那么简单。在我称为用户的主要课程上,例如使用:
[DisplayName("Password")]
[DataType(DataType.Password)]
public string Password { get; set; }
问题是我选择使用edmx模型在设计器中构建我的类(或实际上它是通过从数据库更新构建的)。这意味着代码文件是自动生成的,所以如果我在那里键入我的属性标签,一旦我更新模型,它们就会被覆盖。我在哪里添加这些?
这应该是一个常见的问题,但我似乎找不到合适的解决方案。
答案 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)