【问题标题】:Create item using a ViewModel setting unwanted defaults使用 ViewModel 设置不需要的默认值创建项目
【发布时间】:2014-06-11 08:38:51
【问题描述】:

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

我很确定这是一个很好的做法,但我有点不明白为什么 谁能解释我做错了什么 非常感谢

【问题讨论】:

    标签: asp.net-mvc viewmodel defaults


    【解决方案1】:

    你可以用你想要的任何值来实例化日期。

    您可以在视图模型中使用支持字段(而不是自动属性)并初始化它们:

    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; } }
        ...
    }

    或者您可以在视图模型的构造函数中初始化它们:

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

    【讨论】:

    • 嗨,感谢您的回复,但我根本不想有默认值,我希望它们是空白的..这不是可以实现的吗?
    • 任何适当的日期/日期时间控件当然是特定于浏览器的,据我所知,规范对于日期/日期时间的合理默认值(或者是否为空/空白)有点模糊在语义上永远有效);在这一点上,这种方法可能是不可预测的。如果您要输出普通文本输入,则可以在页面加载时使用 javascript 清除该值。单独的 GET/POST 视图模型似乎有点矫枉过正。
    猜你喜欢
    • 2016-07-08
    • 2012-10-18
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多