编辑不在 URL 上传递 ID 的记录。我喜欢在编辑 GUI 的输入字段中指定 ID

Editing a record not passing an ID on the URL. I like to specify the ID in an Input field of the edit GUI

== 这是我的 C# 代码 ==

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 Microsoft.EntityFrameworkCore;
using WorkCollaboration.Data;
using WorkCollaboration.Models;

namespace WorkCollaboration.Pages.LogonService
{
    public class LoginCreateModel : PageModel
    {
        private readonly WorkCollaboration.Data.WorkCollaborationContext _context;

        public LoginCreateModel(WorkCollaboration.Data.WorkCollaborationContext context)
        {
            _context = context;
        }

        [BindProperty]
        public Models.LogonService LogonService { get; set; }

        public async Task<IActionResult> OnGetAsync(string id)
        {
            if (id == null)
            {
                return Page();
            }

            LogonService = await _context.LogonService.FirstOrDefaultAsync(m => m.WorkColUserMail == id);

            if (LogonService == null)
            {
                return NotFound();
            }
            return Page();
        }

        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://aka.ms/RazorPagesCRUD.
        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Attach(LogonService).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!LogonServiceExists(LogonService.WorkColUserMail))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return RedirectToPage("/LogonService/IndexLogin");
        }

        private bool LogonServiceExists(string id)
        {
            return _context.LogonService.Any(e => e.WorkColUserMail == id);
        }
    }
}

== 这是我的页面 ==

@page
@model WorkCollaboration.Pages.LogonService.LoginCreateModel
@{
    ViewData["Title"] = "LoginCreate";
}

<h1>Edit</h1>

<h4>LogonService</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="LogonService.WorkColUserId" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserPassword" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserPasswordConfirm" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserName" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserVerificationMode" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColLoggedIn" value="true" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserSessionId" value="true" class="form-control" />
            <div class="form-group">
                <label asp-for="LogonService.WorkColUserMail" class="control-label"></label>
                <input type="email" asp-for="LogonService.WorkColUserMail" class="form-control" />
                <span asp-validation-for="LogonService.WorkColUserMail" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="LogonService.WorkColEnteredPassword" class="control-label"></label>
                <input type="password" asp-for="LogonService.WorkColEnteredPassword" class="form-control" />
                <span asp-validation-for="LogonService.WorkColEnteredPassword" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="LogonService.WorkColUserRememberMe" class="control-label"></label>
                <input type="checkbox" asp-for="LogonService.WorkColUserRememberMe" class="form-control" />
                <span asp-validation-for="LogonService.WorkColUserRememberMe" class="text-danger"></span>
            </div>
            <div class="form-group">
                @Html.LabelFor(model => model.LogonService.WorkColUserLanguage, htmlAttributes: new { @class = "form-group" })
                <div class="form-group">
                    @Html.DropDownListFor(model => model.LogonService.WorkColUserLanguage, new List<SelectListItem>
                    {
                        new SelectListItem {Text = "DE", Value = "DE", Selected = true },
                        new SelectListItem {Text = "EN", Value = "EN" },
                    }, new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.LogonService.WorkColUserLanguage, "", new { @class = "text-danger" })
                </div>
            </div>            
            <button type="submit" value="Login" id="LogonService.WorkColUserMail" class="btn btn-primary">Login</button>
        </form>
    </div>
</div>

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

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

当我像这样传递 URL 时 "https://localhost:44379/LogonService/LoginCreate?id=christof.oberholzer@bbv.ch" 我可以获得记录并按照我的意愿进行更新。

!URL ID 1

我更改了我的代码(第 30 行),当 id 为空时我 returns 到页面。结果页面也弹出,我可以在字段中输入我的 ID(邮件),就像我想的那样。在页面的提交行中,我将值放入 Id。但是在 c# 代码中,Id 仍然为空。

请问如何传递id?谢谢

首先,你的表单方法是post,所以它会转到OnPost.Secondly,表单不会post button.You的id可以从LogonService获取WorkColUserMail。 这是一个演示:

登录服务:

public class LogonService
    {
        public string WorkColUserMail { get; set; }
    }

登录创建模型:

  public class LoginCreateModel : PageModel
        {
            [BindProperty]
            public LogonService LogonService { get; set; }
            public IActionResult OnGet(string id)
            {
                return Page();
            }
            public IActionResult OnPost()
            {
                string id = LogonService.WorkColUserMail;
                return Page();
            }
        }

查看:

<form method="post" asp-page-id="LogonService.WorkColUserMail">
    <div class="form-group">
        <label asp-for="LogonService.WorkColUserMail" class="control-label"></label>
        <input type="email" asp-for="LogonService.WorkColUserMail" class="form-control" />
        <span asp-validation-for="LogonService.WorkColUserMail" class="text-danger"></span>
    </div>
    <button type="submit" value="Login" id="LogonService.WorkColUserMail" class="btn btn-primary">Login</button>
</form>

结果: