我使用模型绑定遇到了使用默认值的catch 22。 Tom FitzMacken的教程有以下插入内容:
public void addStudentForm_InsertItem()
{
var item = new Student();
TryUpdateModel(item);
if (ModelState.IsValid)
{
using (SchoolContext db = new SchoolContext())
{
db.Students.Add(item);
db.SaveChanges();
}
}
}
但是如果您的UI中没有必填字段,比如CreatedDate字段,那么TryUpdateModel将无法通过验证。
在调用TryUpdateModel =卡住之前,我看不到如何为它赋值。
答案 0 :(得分:0)
在致电TryUpdateModel(item);
之前,您可以设置必填字段。继续您的CreatedDate
字段示例(让我们假设它的日期时间):
var item = new Student();
//set the value here
item.CreatedDate = DateTime.Today;//.Now if you need the timestamp
//required field now has value, this should succeed
TryUpdateModel(item);
另一个选择,如果您在C#6中,您应该能够为模型中的属性提供默认值:
public DateTime CreatedDate { get; set; } = DateTime.Today;
答案 1 :(得分:0)
使用视图模型并避免此问题。是的,您在实体的映射方面有一些额外的工作,但您从未错过任何验证。视图模型仅包含将进入该请求的字段。
答案 2 :(得分:0)
静态默认值:
有一个System.ComponentModel.DefaultValueAttribute,但文档说 " DefaultValueAttribute不会导致成员使用属性的值自动初始化。 您必须在代码中设置初始值。"
我尝试使用get \ set&它没有设置DV!
然后我将这一行添加到从数据库生成的模型中。 (我首先使用数据库中的代码,因为这是我所有数据库设计的地方)
public tblInvestor()
this.Investor_ContactMethod = "Email"
此工作表示静态默认值&在必填字段上验证。 但它在生成的类和&我无法弄清楚如何使用我的元数据将其纳入我的单独部分课程中? 无法声明另一个公共tblInvestor() - 所以如何放置它?
DateTime默认值:
决定将其放在用户界面上。 或者不要求它&在TryUpdateModel和amp;之间设置它的SaveChanges。