Model属性在剃刀页面中完成了绑定的输入值的大部分工作

时间:2018-08-12 20:31:45

标签: c# asp.net-core razor-pages

我正在使用剃须刀页面构建一个Web应用程序。 我有两个模型DossierLog。我使用脚手架自动为Dossier生成了粗糙的剃须刀页面。

提交与Log Model绑定的表单时,即使我将Log.NumeroDeDossier绑定到表单中的值为NumeroDeDossier = 1的隐藏输入中,它也会使用Dossier.NumeroDeDossier创建Log Model实体。

日志模型:

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.cshtml我显示档案列表。并有一个按钮(如果单击),它将显示一个引导程序模态,并带有一个表单输入。

@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,后者创建一个日志对象并将其添加到数据库ONPOST中。

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

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

    return RedirectToPage("./Index");
} 

1 个答案:

答案 0 :(得分:0)

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

因此,由于该属性是int,但没有发送任何数据,因此在创建对象时,将使用int的默认值。 int的默认值为0。

因此,请使用具有恒定值的隐藏表单字段:

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

只需将其放在您的<form>标记中。由于它具有type="hidden",因此将不会呈现它,但仍将其作为表单请求的一部分发送。