我正在使用剃须刀页面构建一个Web应用程序。
我有两个模型Dossier
和Log
。我使用脚手架自动为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">×</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");
}
答案 0 :(得分:0)
您应该使用隐藏的表单字段,而不是使用display: none
包装在元素中的文本字段。 display: none
将阻止呈现元素,因此文本字段也永远不会呈现。提交表单时,未呈现的文本字段也不会包含在表单数据中。
因此,由于该属性是int
,但没有发送任何数据,因此在创建对象时,将使用int
的默认值。 int
的默认值为0。
因此,请使用具有恒定值的隐藏表单字段:
<input type="hidden" asp-for="Log.NumeroDeDossier" value="@item.NumeroDeDossier" />
只需将其放在您的<form>
标记中。由于它具有type="hidden"
,因此将不会呈现它,但仍将其作为表单请求的一部分发送。