Вопрос:
Я новичок в ядре.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>
Я могу ввести дату вручную, и она работает нормально, но я хочу, чтобы она автоматически загружала текущую дату.
Лучший ответ:
Если вы хотите, чтобы представление загружалось текущим 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 дата может не быть датой посещения клиентом страницы (из-за часовых поясов). Если ваши пользователи и сервер находятся в одном и том же часовом поясе, это будет нормально.
Вы можете использовать DateTime.UtcNow если вам нужна дата UTC, а не дата сервера, на котором запущено приложение, но это не всегда помогает. Вам нужно будет загрузить дату на клиенте (то есть через JavaScript), если вы хотите отобразить фактическую дату для каждого клиента.
Однако я предлагаю вам не использовать сущности (класс, представляющий таблицу) напрямую. Посмотрите на использование ViewModels.
С вашим обновлением я вижу, в чем проблема. LabelTagHelper (что позволяет использовать asp-for в <label>), дает описание свойства, а не его значение. Это связано с тем, что метки предназначены для описания содержимого, которое следует за ними, а не для их содержимого.
Ответ №1
модель
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
Ответ №2
Я изо всех сил старался сделать это и думал, что я опубликую этот ответ, поскольку я только что понял это, и я не мог использовать какие-либо другие методы для работы.
Если вы используете стандартную идентификацию 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»); }
Затем вы можете удалить их из формы на странице (если вы установили поле, как требуется в вашей модели данных, то оно должно оставаться в форме как скрытое поле со значением, назначенным иначе, если форма не будет отправлена – я просто установил значение для 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>
Надеюсь, это поможет другим.
Робин
Ответ №3
Используйте DateTime.UtcNow, чтобы получить текущую дату и время на текущем компьютере, выраженное в скоординированном универсальном времени (UTC)