C# DotNet Core Razor 页面,将值分配给 pageModel 中的 createdModel

C# DotNet Core Razor page, assign value to a createdModel from the pageModel

我正在做一个项目,我需要创建一个表单来填充数据库。

我可以使用 Asp-for handler 来填写表格并且它正在工作。

但是我想在幕后添加一些信息,例如用户和创建日期。

我想做这样的事情:

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 Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.ModelForClients.Add(ModelForClients);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Clients");
        }
    }
}

前视图(剃须刀页面)

@page
@model CreateModel

@{
    ViewData["Title"] = "Create";
}

<div class="adminContainer">


    <div>
        <a asp-page="/Users/Clients/Clients" class="btn btn-danger">
            <i class="bi bi-backspace-fill"></i>
        </a>
    </div>
    <h1>Create</h1>

    <h4>ModelForClients</h4>
    <hr />
    <div class="row">
        <div class="col-md-4">
            <form method="post">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="ModelForClients.LastName" class="control-label"></label>
                    <input asp-for="ModelForClients.LastName" class="form-control" />
                    <span asp-validation-for="ModelForClients.LastName" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ModelForClients.FirstName" class="control-label"></label>
                    <input asp-for="ModelForClients.FirstName" class="form-control" />
                    <span asp-validation-for="ModelForClients.FirstName" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ModelForClients.Adress" class="control-label"></label>
                    <input asp-for="ModelForClients.Adress" class="form-control" />
                    <span asp-validation-for="ModelForClients.Adress" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ModelForClients.Company" class="control-label"></label>
                    <input asp-for="ModelForClients.Company" class="form-control" />
                    <span asp-validation-for="ModelForClients.Company" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ModelForClients.LegalRepresentative" class="control-label"></label>
                    <input asp-for="ModelForClients.LegalRepresentative" class="form-control" />
                    <span asp-validation-for="ModelForClients.LegalRepresentative" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ModelForClients.VatNumber" class="control-label"></label>
                    <input asp-for="ModelForClients.VatNumber" class="form-control" />
                    <span asp-validation-for="ModelForClients.VatNumber" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <p>Utilisateur assigné: @User.Identity.Name</p>
                    <p>Date de création: @Model.CurrentDate </p>
                </div>

                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>

    <div>
        <a asp-page="Index">Back to List</a>
    </div>

</div>

型号:

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; }
        

    }
}

您可以添加您需要的信息作为 hidden 输入。

<input name="CreationDate" value="@model.CreationDate" type="hidden" />
<input name="UserType" value="@model.UserType" type="hidden" />

首先,您需要知道对于复杂类型的每个 属性,模型绑定会在来源中查找名称模式 prefix.property_name.

其次,只有inputselect元素可以表单提交。 p 无法通过表单提交传递给后端。

像下面这样更改您的页面:

<div class="form-group">
    <p>Utilisateur assigné: @User.Identity.Name</p>
    //add this...
    <input asp-for="ModelForClients.UserType" value="@User.Identity.Name" type="hidden" />
    <input asp-for="ModelForClients.CreationDate" value="@Model.CurrentDate" type="hidden" />

    <p>Date de création: @Model.CurrentDate </p>        
</div>

后端:

public class CreateModel : PageModel
{
    public IActionResult OnGet()
    {
        return Page();
    }

    [BindProperty]
    public ModelForClients ModelForClients
    {
        get; set;
    }

    public DateTime CurrentDate = DateTime.Now;  
    public async Task<IActionResult> OnPostAsync()
    {            
        //...
        //no need to set the value like below:
        //ModelForClients.CreationDate = CurrentDate; 
        //ModelForClients.UserType = currentUser
    }
}

结果:

此外,@Merna Mustafa 做的也可以,但是你需要设置 CreationDateUserType 属性(not field)在后端:

[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 Task<IActionResult> OnPostAsync()
    {
        ModelForClients.CreationDate = CurrentDate; 
        ModelForClients.UserType = UserType;
        //...
        return RedirectToPage("./Clients");
    }
}

页数:

<input name="CreationDate" value="@Model.CurrentDate" type="hidden" />
<input name="UserType" value="@User.Identity.Name" type="hidden" />

无论如何,所有这两个解决方案都告诉您模型绑定系统通过 name="PropertyName".

绑定 属性