使用设置不需要的默认值的ViewModel创建项目

时间:2014-04-25 14:49:19

标签: asp.net-mvc viewmodel defaults

我正在使用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?吗?

enter image description here

我很确定这是一个很好的做法,但有点难以理解为什么 任何人都可以解释我做错了 非常感谢

1 个答案:

答案 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; }