我正在使用ViewModel在我的数据库中创建一个新项目 ViewModel只有我希望用户能够设置的属性,当它被回发时,我会创建一个新的“真实”对象并将其保存到数据库中。
我这样做的详情如下
[HttpGet]
public ActionResult Create(int id = 0)
{
var opt = unitOfWork.OptionRepository.GetByID(id);
CreateAvailabilityViewModel model = new CreateAvailabilityViewModel();
model.OptionDescription = opt.Description;
model.CentreCode = opt.CentreCode;
model.OptionID = id;
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateAvailabilityViewModel cavm)
{
if (ModelState.IsValid)
{
OptionAvailability newOA = new OptionAvailability();
DateTime now = DateTime.Now;
newOA.ChangedDate = newOA.CreatedDate = now;
newOA.ChangedBy = newOA.CreatedBy = User.Identity.Name;
newOA.DateFrom = cavm.DateFrom;
newOA.DateTo = cavm.DateTo;
newOA.MinNumbers = cavm.MinNumbers;
newOA.MaxNumbers = cavm.MaxNumbers;
newOA.OptionID = cavm.OptionID;
unitOfWork.OptionAvailabilityRepository.Insert(newOA);
unitOfWork.Save();
return RedirectToAction("Detail", "Option", new { id = newOA.OptionID });
}
return View(cavm);
}
这是ViewModel
public class CreateAvailabilityViewModel
{
[HiddenInput(DisplayValue = false)]
public int OptionAvailabilityID { get; set; }
[HiddenInput(DisplayValue = false)]
public int OptionID { get; set; }
[Required]
public DateTime DateFrom { get; set; }
[Required]
public DateTime DateTo { get; set; }
[Required]
public int MinNumbers { get; set; }
[Required]
public int MaxNumbers { get; set; }
public string CentreCode { get; set; }
public string OptionDescription { get; set; }
}
我面临的问题是,在呈现表单时,日期和整数的表单字段默认为01/01/0001和0而不是空白。我正在使用Html.EditorFor帮助器来呈现输入我认为这是因为在HttpGet Create方法中,当我实例化ViewModel时,它使用类型默认值然后将它们传递到对象中的表单,但是这不是我想要发生的事情..我需要将这些属性设置为DateTime?
和/或int?
吗?
我很确定这是一个很好的做法,但有点难以理解为什么 任何人都可以解释我做错了 非常感谢
答案 0 :(得分:0)
您可以使用您想要的任何值来实例化日期。
您可以在viewmodel中使用支持字段(而不是自动属性)并初始化它们:
public class MyViewModel
{
private DateTime _firstDate = new DateTime(12/12/2012);
private DateTime _secondDate = DateTime.Now();
public DateTime FirstDate { get { return _firstDate; } set { _firstDate = value; } }
...
}
或者您可以在viewmodel的构造函数中初始化它们:
public class MyViewModel
{
public MyViewModel(DateTime firstDate)
{
FirstDate = firstDate;
SecondDate = DateTime.Now();
}
public DateTime FirstDate { get; set; }
....
}
或者您可以在控制器中初始化它们;你可能会有这个想法。
还考虑使用元数据来装饰这些成员:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime FirstDate { get; set; }