在创建新对象时,使用MVC4遇到一些问题并使用外键编写第一个EF6代码。
我有两个模型(Job和JobItem),JobItem的JobID是作业模型上ID的外键关系。
当插入JobItem时,ModelState报告它无效并返回错误声明需要作业模型上的另一个字段。代码访问JobItem模型的JobID属性(由表单上的用户选择)但似乎EF正在创建id为0的Job对象并使用一些默认值填充它。
从ModelState返回的错误是Billing currency字段是必需的。结算货币是作业模型中的必填字段。
我可以设置Job对象并清除ModelState,但这不是一个好主意,因为它会隐藏任何其他问题。
JobItem Model
[Display(Name = "Job number")]
[Required]
[ForeignKey("Job")]
public Int64 JobID { get; set; }
public virtual Job Job { get; set; }
JobItem编辑视图
<div class="csam-section-block">
<div class="editor-label">
@Html.LabelFor(model => model.Model.JobID)
</div>
<div class="editor-field">
@if (@Model.Model.Job == null)
{
@Html.TextBox("Model.Job.Number", String.Empty, new { @class = "csam-change-field" })
}
else
{
@Html.TextBoxFor(model => model.Model.Job.Number, new {@class="csam-change-field"})
}
@Html.HiddenFor(model => model.Model.JobID)
@Html.ValidationMessageFor(model => model.Model.JobID)
</div>
<div class="csam-lookup-section">
<input type="button" class="tbl_lookup_btn, csam-lookup-button" name='Job' value='Job,JobID' />
</div>
</div>
更新1:显示ModelState错误
正如Alan所述,当进入SubmitForm控制器操作时,ModelState立即无效。
答案 0 :(得分:1)
我正在与OP合作。事实证明,这是Job模型中的一个问题。作业上的CurrencyID导致ModelState错误,这非常奇怪,因为它甚至没有显示在视图中。在模型中进行仔细检查时,出现了一个不一致的地方,即CurrencyID被标记为int64?但有必需属性。它确实是一个必填字段,因此我将其更改为Int64并且工作正常。