c# - 模型属性对它绑定在剃须刀页面中的输入的值有很大影响
问题描述
我正在使用剃须刀页面构建一个网络应用程序。我有两个模型Dossier
和Log
. 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.cshtml
I 显示档案列表。如果单击它有一个按钮,它会显示一个引导模式,带有一个表单输入。
@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,后者创建一个 Log Object 并将其添加到数据库ONPOST
中。
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Log.Add(Log);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
解决方案
您应该使用隐藏的表单域,而不是用 . 包裹在元素中的文本域display: none
。这display: none
将阻止元素被渲染,因此文本字段也永远不会被渲染。提交表单时,未呈现的文本字段也不包含在表单数据中。
因此,因为属性是 anint
但没有发送数据,所以int
在创建对象时使用 an 的默认值。并且默认值为int
0。
因此,改为使用具有常量值的隐藏表单字段:
<input type="hidden" asp-for="Log.NumeroDeDossier" value="@item.NumeroDeDossier" />
把它放在你的<form>
标签里。因为它有type="hidden"
,所以它不会被渲染,但该值仍将作为表单请求的一部分发送。
推荐阅读
- flutter - Flutter 的谷歌地图小部件没有被 Card 或 ClipRRect 裁剪
- html - WebStorm 无法链接其他目录中的图像
- python-3.x - Python在打开时停止工作并给出异常处理错误
- python-3.x - 如何在python中读取批处理文件并检索特定数据
- html - 如何在 HTML 中循环显示图像
- c# - 向通过 IHttpClientFactory 创建的所有客户端添加处理程序?
- css - 在 safari 浏览器中单击时,bootstrap vue(b-tabs)显示蓝色轮廓
- angular - *ngif 模板中的 typescript null 错误
- jquery - 引导轮播仅适用于 jquery slim
- android - 无法从后端服务器获取 jwt