首页 > 解决方案 > 模型属性对它绑定在剃须刀页面中的输入的值有很大影响

问题描述

我正在使用剃须刀页面构建一个网络应用程序。我有两个模型DossierLog. Dossier我生成了用于自动使用脚手架的 crud razor 页面。

提交与 Log Model 绑定的表单时,它会创建一个带有 的 Log Model 实体NumeroDeDossier = 1,即使我已将 Log.NumeroDeDossier 与表单中的隐藏输入绑定,其值为Dossier.NumeroDeDossier

日志模型:

public class Log
{
    public int LogID { get; set; }
    public int NumeroDeDossier { get; set; }
    [ForeignKey("Agent")]
    public int AgentID { get; set; }
    public DateTime DateDeSortie { get; set; }
    public DateTime DateDeRetour { get; set; }

    public Log()
    {
        DateDeSortie = DateTime.Now;
    }

档案模型:

public class Dossier
{
    [Key]
    public int NumeroDeDossier { get; set; }
    [ForeignKey("Agent")]
    public int AgentID { get; set; }
    [ForeignKey("Placard")]
    public string PlacardID { get; set; }
    public int Tiroir { get; set; }
    public bool ExFlag { get; set; }

    public Dossier()
    {
        ExFlag = true;
    }

}

我的档案Index.cshtmlI 显示档案列表。如果单击它有一个按钮,它会显示一个引导模式,带有一个表单输入。

@foreach (var item in Model.Dossier) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.NumeroDeDossier)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AgentID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PlacardID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Tiroir)
        </td>
        <td>
            @if(item.ExFlag)
            {
                <div class="situation in"></div>
            }
            else
            {
                <div class="situation out"></div>
            }
        </td>
        <td>
            <a asp-page="./Edit" asp-route-id="@item.NumeroDeDossier">تعديل</a> |
            <a asp-page="./Details" asp-route-id="@item.NumeroDeDossier">تفاصيل</a> |
            <a asp-page="./Delete" asp-route-id="@item.NumeroDeDossier">حذف</a> |
            // here is the modal trigger
            <a data-toggle="modal" data-target="#largeShoes" class="borrow">استعارة</a>
        </td>

        <div class="form-group" style="display:none">
            // Added the input outside of the model to have an input for every item.
            //vaue of the input is Numero de Dossier (When i change it with a const ("11" for exemple) ut works)
            <input form="myform" asp-for="Log.NumeroDeDossier" class="form-control" value="@item.NumeroDeDossier"/> 
            <span asp-validation-for="Log.NumeroDeDossier" class="text-danger"></span>
        </div>
    </tr>
    <div class="modal fade" id="largeShoes" tabindex="-1" role="dialog" aria-labelledby="modalLabelLarge" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">

                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="modalLabelLarge">رجاء أدخل رقم تأجير المستعير</h4>
                </div>

                <div class="modal-body">
                    <form id="myform" method="POST">
                        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                        <div class="form-group">
                            <label class="control-label">رقم التأجير @item.NumeroDeDossier </label>
                            <input asp-for="Log.AgentID" class="form-control" />
                            <span asp-validation-for="Log.AgentID" class="text-danger"></span>
                        </div>

                        <div class="form-group">
                            <input type="submit" value="إضافة" class="btn btn-default" />
                        </div>
                    </form>
                </div>

            </div>
        </div>
    </div>
}

该表单链接到 Index.cshtml.cs,后者创建一个 Log Object 并将其添加到数据库ONPOST中。

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

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

    return RedirectToPage("./Index");
} 

标签: c#asp.net-corerazor-pages

解决方案


您应该使用隐藏的表单域,而不是用 . 包裹在元素中的文本域display: none。这display: none将阻止元素被渲染,因此文本字段也永远不会被渲染。提交表单时,未呈现的文本字段也不包含在表单数据中。

因此,因为属性是 anint但没有发送数据,所以int在创建对象时使用 an 的默认值。并且默认值为int0。

因此,改为使用具有常量值的隐藏表单字段:

<input type="hidden" asp-for="Log.NumeroDeDossier" value="@item.NumeroDeDossier" /> 

把它放在你的<form>标签里。因为它有type="hidden",所以它不会被渲染,但该值仍将作为表单请求的一部分发送。


推荐阅读