#c# #asp.net #asp.net-core #razor
Вопрос:
Я создаю проект, в котором мне нужно создать форму для заполнения базы данных.
Я могу использовать обработчик Asp-for для заполнения формы, и это работает.
Но есть некоторая информация, которую я хотел бы добавить за кулисами, например, пользователь и дата создания.
Я хотел бы сделать что-то подобное:
public DateTime CurrentDate = DateTime.Now; ModelForClients.CreationDate = CurrentDate; //That is what I would like to do. ModelForClients.UserType = currentUser // User which is filling the form I'm using login with Identity framework
Можете ли вы сказать мне, как мы можем добавить информацию из модели страницы ?
Страница модели (cshtml.cs)
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using ArchiProjectManager.Data; using ArchiProjectManager.Models; using Microsoft.AspNetCore.Identity; namespace ArchiProjectManager.Pages.Users.Clients { public class CreateModel : PageModel { private readonly ArchiProjectManager.Data.ApplicationDbContext _context; public CreateModel(ArchiProjectManager.Data.ApplicationDbContext context) { _context = context; } public IActionResult OnGet() { return Page(); } [BindProperty] public ModelForClients ModelForClients { get; set; } //Variables added for the form public DateTime CurrentDate = DateTime.Now; ModelForClients.CreationDate = CurrentDate; //That is what I would like to do. ModelForClients.UserType = currentUser // User which is filling the form I'm using login with Identity framework //Need to continue to add the user name and current date for the creation // To protect from overposting attacks, see https://aka.ms/RazorPagesCRUD public async Tasklt;IActionResultgt; OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.ModelForClients.Add(ModelForClients); await _context.SaveChangesAsync(); return RedirectToPage("./Clients"); } } }
Вид спереди (страница бритвы)
@page @model CreateModel @{ ViewData["Title"] = "Create"; } lt;div class="adminContainer"gt; lt;divgt; lt;a asp-page="/Users/Clients/Clients" class="btn btn-danger"gt; lt;i class="bi bi-backspace-fill"gt;lt;/igt; lt;/agt; lt;/divgt; lt;h1gt;Createlt;/h1gt; lt;h4gt;ModelForClientslt;/h4gt; lt;hr /gt; lt;div class="row"gt; lt;div class="col-md-4"gt; lt;form method="post"gt; lt;div asp-validation-summary="ModelOnly" class="text-danger"gt;lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.LastName" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.LastName" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.LastName" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.FirstName" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.FirstName" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.FirstName" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.Adress" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.Adress" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.Adress" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.Company" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.Company" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.Company" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.LegalRepresentative" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.LegalRepresentative" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.LegalRepresentative" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="ModelForClients.VatNumber" class="control-label"gt;lt;/labelgt; lt;input asp-for="ModelForClients.VatNumber" class="form-control" /gt; lt;span asp-validation-for="ModelForClients.VatNumber" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;pgt;Utilisateur assigné: @User.Identity.Namelt;/pgt; lt;pgt;Date de création: @Model.CurrentDate lt;/pgt; lt;/divgt; lt;div class="form-group"gt; lt;input type="submit" value="Create" class="btn btn-primary" /gt; lt;/divgt; lt;/formgt; lt;/divgt; lt;/divgt; lt;divgt; lt;a asp-page="Index"gt;Back to Listlt;/agt; lt;/divgt; lt;/divgt;
Модель:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace ArchiProjectManager.Models { public class ModelForClients { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ClientId { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string Adress { get; set; } public string Company { get; set; } public string LegalRepresentative { get; set; } public string VatNumber { get; set; } public virtual User User { get; set; } public DateTime CreationDate { get; set; } public DateTime ModificationDate { get; set; } public string UserType { get; set; } } }
Комментарии:
1. Привет @Rena, это работает, большое вам спасибо 😀 И мне понравилось, как вы сделали небольшое видео, чтобы показать. Еще раз спасибо вам.
Ответ №1:
Во-первых,вам нужно знать, что для каждого свойства сложного типа привязка модели просматривает источники для шаблона имени prefix.property_name
.
Во-вторых, только input
select
элементы и могут быть представлены в форме. p
не может быть передано в серверную часть с помощью отправки формы.
Измените свою страницу, как показано ниже:
lt;div class="form-group"gt; lt;pgt;Utilisateur assigné: @User.Identity.Namelt;/pgt; //add this... lt;input asp-for="ModelForClients.UserType" value="@User.Identity.Name" type="hidden" /gt; lt;input asp-for="ModelForClients.CreationDate" value="@Model.CurrentDate" type="hidden" /gt; lt;pgt;Date de création: @Model.CurrentDate lt;/pgt; lt;/divgt;
Бэкэнд:
public class CreateModel : PageModel { public IActionResult OnGet() { return Page(); } [BindProperty] public ModelForClients ModelForClients { get; set; } public DateTime CurrentDate = DateTime.Now; public async Tasklt;IActionResultgt; OnPostAsync() { //... //no need to set the value like below: //ModelForClients.CreationDate = CurrentDate; //ModelForClients.UserType = currentUser } }
Кроме того, то, что сделал @Merna Мустафа, тоже нормально, но вам нужен набор CreationDate
и UserType
свойство(не поле) в бэкэнде:
[BindProperties] //use BindProperties to bind all the properties, //then you no need add multiple BindProperty attributes public class CreateModel: PageModel { public IActionResult OnGet() { return Page(); } public ModelForClients ModelForClients { get; set; } //add properties here...... public DateTime CurrentDate { get; set; } = DateTime.Now; public string UserType { get; set; } public async Tasklt;IActionResultgt; OnPostAsync() { ModelForClients.CreationDate = CurrentDate; ModelForClients.UserType = UserType; //... return RedirectToPage("./Clients"); } }
Страница:
lt;input name="CreationDate" value="@Model.CurrentDate" type="hidden" /gt; lt;input name="UserType" value="@User.Identity.Name" type="hidden" /gt;
В любом случае, все два решения говорили вам, что система привязки модели связывает свойство по name="PropertyName"
.
Ответ №2:
Вы можете добавить необходимую вам информацию в качестве hidden
входных данных.
lt;input name="CreationDate" value="@model.CreationDate" type="hidden" /gt; lt;input name="UserType" value="@model.UserType" type="hidden" /gt;
Комментарии:
1. Спасибо вам, а также @ Rena, это работает 😀
2. Всегда пожалуйста 🙂