我是.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>
我可以手动输入日期并且工作正常,但我希望它能自动加载当前日期。
答案 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>
希望这有助于其他人。
罗宾