c# - 提交表单时无法获取外键值
问题描述
我目前在我的ASP.NET Core
项目中工作。我创建了一些已映射到数据库表的类。
差事类:
public class Errand : IDbEntity
{
public int Id { get; set; }
public int PANumber { get; set; }
public string Description { get; set; }
public string Issuer { get; set; }
public string Stakeholders { get; set; }
public string Background { get; set; }
public string DescriptionOfMission { get; set; }
public string AcceptanceCriteria { get; set; }
public string TestObject { get; set; }
public DateTime AvailableFrom { get; set; }
public DateTime TestStart { get; set; }
public DateTime TestDelivery { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public int CoreId { get; set; }
public virtual Core Core { get; set; }
public int MachineTypeId { get; set; }
public virtual MachineType MachineType { get; set; }
public int ProjectNrId { get; set; }
public virtual ProjectNumber ProjectNr { get; set; }
public int TestTypeId { get; set; }
public virtual Group TestType { get; set; }
public virtual DBErrandStatus status { get; set; }
}
其他类看起来彼此相同。这是Core的类:
public class Core : IDbEntity
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public virtual ICollection<Errand> Errands { get; set; }
}
我已经迁移到数据库,一切正常,并且 Errand 表包含Core, Group, MachineType & ProjectNumber
.
现在到我的问题。我正在尝试创建 AErrand
并在用户将为差事选择值的视图中为外键创建下拉列表。这是代码:
<form method="post" asp-controller="Home" asp-action="ExecuteCreateErrand">
<div class="row">
<div class="col-md-2">
<label>PA number:</label>
<input asp-for="@Model.errand.PANumber" class="form-input" type="text" />
</div>
<div class="col-md-4">
<label>Title:</label>
<input asp-for="@Model.errand.Description" class="form-input" placeholder="Title" type="text" />
</div>
<div class="col-md-2">
<label>Core:</label>
<select asp-for="@Model.errand.Core" class="form-input">
@foreach(var core in Model.Core)
{
<option>@core.Name</option>
}
</select>
</div>
<div class="col-md-4">
<label>Project Nr:</label>
<select asp-for="@Model.errand.ProjectNr" class="form-input">
@foreach(var projNr in Model.ProjectNumber)
{
<option>@projNr.Name</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-md-2">
<label>Machine type:</label>
<select asp-for="@Model.errand.MachineType" class="form-input">
@foreach (var MT in Model.MachineType)
{
<option>@MT.Name</option>
}
</select>
</div>
<div class="col-md-4">
<label>Issuer:</label>
<input asp-for="@Model.errand.Issuer" class="form-input" value="@Model.User.Username" type="text" readonly />
</div>
<div class="col-md-2">
<label>Test type</label>
<select asp-for="@Model.errand.TestType" class="form-input">
@foreach (var TestType in Model.TestType)
{
<option>@TestType.Name</option>
}
</select>
</div>
<div class="col-md-4">
<label>Stakeholders</label>
<input class="form-input" asp-for="@Model.errand.Stakeholders" placeholder="Stakeholders" type="text" />
</div>
</div>
<div class="row">
<div id="sandbox-container" class=" span5 col-md-4">
<label>Testobject avalible from:</label>
<input asp-for="@Model.errand.AvailableFrom" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
</div>
<div id="sandbox-container" class=" span5 col-md-4">
<label>Desired start of test:</label>
<input asp-for="@Model.errand.TestStart" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
</div>
<div id="sandbox-container" class=" span5 col-md-4">
<label>Desired end of test:</label>
<input asp-for="@Model.errand.TestDelivery" class="form-input" type="text" value="@DateTime.Now.ToString("yyyy/MM/dd")" />
</div>
</div>
<div class="row">
<div class="col-md-10"></div>
<div class="col-md-2">
<button type="submit" class="btn btn-lg btn-block mt-4 vBtn">Create Errand</button>
</div>
</div>
</form>
但是,当我后来在提交表单后运行的操作上设置断点时,我得到Errand.Core = null
了Errand.CoreId = 0
这是该操作的代码:
public IActionResult ExecuteCreateErrand([FromForm] Errand errand)
{
var SQL = new SQLErrandStorage();
var handler = new ErrandHandler(SQL);
handler.Create(errand);
return RedirectToAction("RenderAllErrandsView", "Home");
}
[FromForm] Errand errand
返回这个
核心 = null 和 CoreId = 0
Action 调用此方法:
public void Create(Errand errand)
{
errandStorage.CreateErrand(errand);
}
它又调用这个创建差事的方法:
public void CreateErrand(Errand errand)
{
using (var db = new PADBContext())
{
db.Errand.Add(errand);
db.SaveChanges();
}
}
我的问题是如何使外键附加在提交的表单中。如何将值更改为Core = null and CoreId = 0
我在下拉列表中选择的值?
我希望这能很好地解释我的问题。我真的很感激一些帮助或一些反馈。提前致谢!
解决方案
问题似乎是标签助手中asp-for
值的错误绑定。指定选择元素的模型属性名称,而不是模型。select
Select Tag Helper
asp-for
如果你想得到Errand.CoreId
,你可以设置如下asp-for
的选择标签助手:
<label>Core:</label>
<select asp-for="@Model.errand.CoreId" class="form-input">
@foreach (var core in Model.Core)
{
<option value="@core.Id">@core.Name</option>
}
</select>
如果你想得到Errand.Core
,你可以设置选择标签助手的 asp-for,如下所示:
<label>Core:</label>
<select asp-for="@Model.errand.Core.Id" class="form-input">
@foreach (var core in Model.Core)
{
<option value="@core.Id">@core.Name</option>
}
</select>
推荐阅读
- angular - 有角度的 ng-chat 消息传递自己但无法向最终用户传递消息
- react-native - 嘿,我想在折线图中每周显示电池电量数据
- python - Python检查字符串是否包含特定字符串列表中的单词
- pine-script - Pine 脚本收到“语法错误”
- r - 如何按类别.csv(在R中)创建文件夹和复制图像
- python - 如何准备指纹图像作为 CNN 的输入?
- r - 从目录中读取文件,将它们转换为列表以进行扰乱图输入
- c# - 我必须在 Oculus 中制作语音聊天应用程序。我应该用谷歌搜索什么关键字或如何让它在 Oculus 中工作?
- javascript - 赛普拉斯如何在两个元素之间使用“cy.get”
- android - 如何以编程方式计算android中LTE的SINR?