如何在ASP.NET Core MVC中获取当前日期?

时间:2018-01-15 15:43:29

标签: c# asp.net-core asp.net-core-mvc

我是.net核心的新手,所以我所做的是创建标题,日期,描述,图像的文章

这是我的模特

public class Article
{
    [Key]
    public int Id { get; set; }

    [StringLength(200)]
    [Required(ErrorMessage = "Required")]
    public string ArticleTitle { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

    public DateTime ArticleDate { get; set; }

    [DataType(DataType.MultilineText)]
    public string ArticleDescriotion { get; set; }
    public string ArticleImage { get; set; }
}

这是控制器

public IActionResult CreateArticle()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult CreateArticle(Article article)
{
    if (ModelState.IsValid)
    {
        context.Articales.Add(article);
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(article);
}

这是视图

<div class="form-group">
    <label asp-for="ArticleDate" class="col-md-4 control-label" ></label>
     <input asp-for="ArticleDate" class="form-control">
</div>

我可以手动输入日期并且工作正常,但我希望它能自动加载当前日期。

4 个答案:

答案 0 :(得分:7)

如果要使用当前DateTime加载视图,可以使用:

public class Article
{
    ... your current code

    public Article()
    {
        ArticleDate = DateTime.Now;
    }
}

或者,您可以直接将模型传递给视图:

public IActionResult CreateArticle()
{
    var model = new Article { ArticleDate = DateTime.Now };
    return View(model);
}

请注意,使用DateTime.Now时,日期可能不是客户访问该页面的日期(由于时区)。如果您的用户和服务器都在同一时区,那就没问题了 如果您想要UTC日期而不是运行应用程序的服务器的日期,则可以使用DateTime.UtcNow,但这并不总是有帮助。如果要显示每个客户端的实际日期,则需要在客户端中加载日期(即通过JavaScript)。

但是,我建议您直接使用使用实体(代表表的类)。查看使用ViewModels。

通过您的更新,我会看到问题所在。 LabelTagHelper(允许您在asp-for中使用<label>的内容)会呈现属性的描述,而不是其值。这是因为标签用于描述其后面的内容,而不是其内容。

答案 1 :(得分:1)

使用DateTime.UtcNow获取当前计算机上的当前日期和时间,以协调世界时(UTC)表示

答案 2 :(得分:0)

模型

public class Article
{
    [Key]
    public int Id { get; set; }

    [StringLength(200)]
    [Required(ErrorMessage = "Required")]
    public string ArticleTitle { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

    public DateTime ArticleDate { get; set; }
    public Article()
    {
        ArticleDate = DateTime.Now;
    }

    [DataType(DataType.MultilineText)]
    public string ArticleDescriotion { get; set; }
    public string ArticleImage { get; set; }
}

视图

  <label asp-for="ArticleDate" class="col-md-4 control-label">@Html.DisplayFor(Model => Model.ArticleDate)</label>

这对我的工作非常感谢大家特别为@Camilo Terevinto

答案 3 :(得分:0)

我一直在努力做到这一点,并且认为我会发布这个答案,因为我刚想出来,我无法使用任何其他方法。

如果使用标准ASP.NET标识并创建自定义数据模型,则可以覆盖页面模型的OnPostAsync方法中的默认值:

//Override values for created by and date
Blog.CreatedDate = DateTime.Now;
Blog.CreatedBy = User.Identity.Name.ToString();

在此处而不是在表单上定义值意味着人们无法过度发布数据。

所以这个方法现在看起来像:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    //Override values for created by and date
    Blog.CreatedDate = DateTime.Now;
    Blog.CreatedBy = User.Identity.Name.ToString();

    _context.Blogs.Add(Blog);
    await _context.SaveChangesAsync();

    return RedirectToPage("./Index");
}

然后你可以从页面上的表单中删除这些(如果你已经在数据模型中按要求设置了字段,那么它必须作为隐藏字段保留在表单上,​​并指定值,否则表单将不会提交 - I只需将值设置为X,无论如何都要覆盖它:)

<div class="form-group">
    <input asp-for="Blog.CreatedBy" class="form-control" value="X" hidden />
    <span asp-validation-for="Blog.CreatedBy" class="text-danger"></span>
</div>

希望这有助于其他人。

罗宾