Страница C# DotNet Core Razor, присвоьте значение созданной модели из модели страницы

#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. Всегда пожалуйста 🙂