【问题标题】:How to set a default value to a DateTime parameter如何为 DateTime 参数设置默认值
【发布时间】:2016-01-20 10:25:56
【问题描述】:

在我的 MVC 应用程序中,我想将默认值设置为 DateTime 参数。

[HttpPost]
public ActionResult BudgetVSActualTabular(DateTime startDate)
{
    var Odata = _db.sp_BudgetedVsActualTabular(startDate).ToList();    
    string[] monthName = new string[12];    
    for (int i = 0; i < 12;i++ )
    {
        DateTime date = startDate;
        date = date.AddMonths(i);
        monthName[i] = date.ToString("MMMM") + " " + date.Year.ToString();     
    }

    ViewBag.startDate = new SelectList(_db.DaymonFinancialYears, "startDate", "DateRange");    
    var MonthName = monthName.ToList();
    ViewBag.Bdata = Odata;
    ViewBag.Cdata = MonthName;
    return View();
}

【问题讨论】:

    标签: c# asp.net-mvc datetime


    【解决方案1】:

    您不能将null 设置为DateTime,但可以使用Nullable DateTime 参数代替:

    [HttpPost]
    public ActionResult BudgetVSActualTabular(DateTime? startDate = null )
    { 
        if (startDate == null)
        {
            startDate  = new DateTime(2016, 06, 01);
        }
        //You should pass startDate.Value
        var Odata = _db.sp_BudgetedVsActualTabular(startDate.Value).ToList();
    
    }
    

    【讨论】:

    • 我需要将日期设置为 2014-06-01,所以它会像 '[HttpPost] public ActionResult BudgetVSActualTabular(DateTime? startDate = null ) { }' ?
    • @simba...你可以给startDate一个默认值=null然后你可以将它设置为2014-06-01如果它是null在你的BudgetVSActualTabular方法中。
    【解决方案2】:

    您可以将default keyword 与此语法一起使用

    public ActionResult BudgetVSActualTabular(DateTime startDate = default(DateTime))
    

    这样可以在不传递任何参数的情况下调用该方法,并且在您的方法内部,startDate 变量将等于 DateTime.MinValue

    如果您需要默认为特定日期而不是DateTime.MinValue,您可以编写一个简单的测试

    public ActionResult BudgetVSActualTabular(DateTime startDate = default(DateTime))
    {
        if(startDate == DateTime.MinValue)
            startDate = new DateTime(2014,6,1);
    
        // After the check for a missing parameter pass the startDate as before
        var Odata = _db.sp_BudgetedVsActualTabular(startDate).ToList();
        .....
    }
    

    【讨论】:

    • 我需要将日期设置为 2014-06-01,所以它会像 '[HttpPost] public ActionResult BudgetVSActualTabular(DateTime? startDate = null ) { }' ?
    • 如果是这种情况,只需在使用传递的值之前添加一个测试
    【解决方案3】:

    命名和可选(默认)参数从 C# 4.0 开始可用。如果您使用的是旧版本,您可能会重载您的方法,例如:

     public ActionResult BudgetVSActualTabular()
     {
          return BudgetVSActualTabular(new DateTime(2014,6,1));
     }
    

    【讨论】:

    • 但我想分配一个特定的值,而不是任何值或空值。所以我不得不使用史蒂夫和其他用户建议我的东西。
    • @simba 您可以在调用方法之前进行测试,并更改重载(查看我更新的答案)
    【解决方案4】:

    我建议将 DateTime 设置为可为空 public ActionResult BudgetVSActualTabular(DateTime? startDate)

    如果 DateTime 为空,您可以在控制器内部使用 DateTime.HasValue 设置默认值。

    var nonNullableDate = startDate.HasValue ? startDate.Value : new DateTime();

    [HttpPost]
    public ActionResult BudgetVSActualTabular(DateTime? startDate)
    {
        var nonNullableDate = startDate.HasValue ? startDate.Value : new DateTime();
        var Odata = _db.sp_BudgetedVsActualTabular(nonNullableDate).ToList();    
        string[] monthName = new string[12];    
        for (int i = 0; i < 12;i++ )
        {
            DateTime date = nonNullableDate;
            date = date.AddMonths(i);
            monthName[i] = date.ToString("MMMM") + " " + date.Year.ToString();     
        }
    
        ViewBag.startDate = new SelectList(_db.DaymonFinancialYears, "startDate", "DateRange");    
        var MonthName = monthName.ToList();
        ViewBag.Bdata = Odata;
        ViewBag.Cdata = MonthName;
        return View();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 2013-10-07
      • 1970-01-01
      • 2013-01-01
      • 2011-07-31
      • 1970-01-01
      • 2011-03-03
      • 2013-04-28
      相关资源
      最近更新 更多