我有一个旨在从数据库中删除的视图.

该视图已正确填充.当我单击Delete按钮时,视图上的ID不会传递给控制器.当我在控制器中有一个断点时,已经从视图中收到了一个null值.

在视图中,当我从这个<input asp-for="Form.Id" hidden />中移除隐藏项时,Id是可见的.然而,当我单击Delete按钮时,传递的Idnull.

我的模特:

namespace PricingParameters.Models
{
    public class Form
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [Display(Name = "Branch")]
        public int BranchId { get; set; } = 0;

        [ValidateNeverAttribute]
        public Branch Branch { get; set; }

        [Required]
        public int FormTypeId { get; set; } = 0;

        [ValidateNeverAttribute]
        public FormType FormType { get; set; }

        [Required]
        [Display(Name = "Form Cost")]
        [DisplayFormat(DataFormatString = "{0:N2}", ApplyFormatInEditMode = true)]
        public double Value { get; set; } = 0;

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Modified Date")]
        public DateTime ModifedDateTime { get; set; } = DateTime.Now;

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Created Date")]
        public DateTime CreatedDateTime { get; set; } = DateTime.Now;
    }
}

我的视图模型:

namespace PricingParameters.Models.ViewModels
{
    public class FormVM
    {
        public required Form Form { get; set; }
        [ValidateNever]
        public required IEnumerable<SelectListItem> BranchList { get; set; }
        [ValidateNever]
        public required IEnumerable<SelectListItem> FormTypeList { get; set; }
    }
}

我的看法:

@model PricingParameters.Models.ViewModels.FormVM

@{
    ViewData["Title"] = "Form Cost Delete";
}

<form method="post" asp-action="Delete">
    <input asp-for="Form.Id" hidden />
    <div class="border p-3 mt-4">
        <div class="row pb-2">
            <h2 class="text-primary">Delete Form Cost</h2>
            <hr />
        </div>
        <div class="mb-3">
            <label asp-for="Form.BranchId"></label>
            <select asp-for="Form.BranchId" disabled asp-items="@Model.BranchList" class="form-select">
                <option disabled selected>--Branch--</option>
            </select>
        </div>
        <div class="mb-3">
            <label asp-for="Form.FormTypeId"></label>
            <select asp-for="Form.FormTypeId" disabled asp-items="@Model.FormTypeList" class="form-select">
                <option disabled selected>--Form Type--</option>
            </select>
        </div>
        <div class="mb-3">
            <label asp-for="Form.Value"></label>
            <input asp-for="Form.Value" disabled class="form-control" />
        </div>
        <button type="submit" class="btn btn-primary" style="width:150px">Delete</button>
        <a asp-controller="Form" asp-action="Index" class="btn btn-secondary" style="width:150px">
            Back to List
        </a>
    </div>
</form>

我的FormController中的Delete项行动:

// POST
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public IActionResult DeletePOST(int? id) 
{ 
    var obj = _unitOfWork.Form.GetFirstOrDefault(u => u.Id == id);

    if (obj == null)
    {
        TempData["error"] = "Form Cost not deleted";
        return RedirectToAction(nameof(Index));
    }

    _unitOfWork.Form.Remove(obj);
    _unitOfWork.Save();

    TempData["success"] = "Form Cost deleted successfully";

    return RedirectToAction(nameof(Index));
}

这个代码几乎是另一种工作模式的逐个字符.

推荐答案

在上面的问题中使用的<input asp-for="Form.Id" hidden />标签助手将生成以下HTML:

<input hidden type="number" id="Form_Id" name="Form.Id" data-val-required="The Id field is required."  ...

正如我们所看到的,生成的名称是name="Form.Id".这就是绑定不能正常工作的原因,因为在服务器端,预期的名称被定义为id.

要解决此问题,请显式定义标记名:

<input asp-for="Form.Id" name="id" hidden />

Csharp相关问答推荐

图形.DrawString奇怪异常的字距调整

为什么在ANTLR4中会出现不匹配的输入错误?""

S能够用DATETIME来计算,这有什么错呢?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

如何在页面重新加载后保持菜单切换状态

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

使用带有参数和曲面的注入失败(&Q;)

当试图限制EF Select 的列时,如何避免重复代码?

ReadOnlyMemory访问基础索引的替代方案

Foreach非常慢的C#

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

如何更改Datagridview行标题

如何将行添加到DataGrid以立即显示它?

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

C#中的逻辑运算符用作单词';is';and';and';

如何根据分割文本的块数来计算文本的大小?

Unity 3D-意外轴捕捉和未知力对脉冲react 行为的影响

是否在异步方法中避免Span<;T>;.ToArray()?

部署Aspnet Blazor服务器时出现未处理的Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]异常