C# ASP.NET MVC 4-外键对象设置为id为0的某个默认对象

C# ASP.NET MVC 4-外键对象设置为id为0的某个默认对象,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,在创建新对象时,MVC4和使用外键编写第一个EF6有点问题 我有两个模型(Job和JobItem),JobItem将JobID作为与Job模型上ID的外键关系 在JobItem中插入时,ModelState报告它无效,并返回一个错误,声称作业模型上需要另一个字段。代码访问JobItem模型(由用户在表单上选择)的JobID属性,但似乎EF正在创建id为0的作业对象,并用一些默认值填充它 ModelState返回的错误是需要“记帐货币”字段。记帐货币是作业模型上的必填字段 我可以设置作业对象并清除

在创建新对象时,MVC4和使用外键编写第一个EF6有点问题

我有两个模型(Job和JobItem),JobItem将JobID作为与Job模型上ID的外键关系

在JobItem中插入时,ModelState报告它无效,并返回一个错误,声称作业模型上需要另一个字段。代码访问JobItem模型(由用户在表单上选择)的JobID属性,但似乎EF正在创建id为0的作业对象,并用一些默认值填充它

ModelState返回的错误是需要“记帐货币”字段。记帐货币是作业模型上的必填字段

我可以设置作业对象并清除ModelState,但这不是一个好主意,因为它会隐藏任何其他问题

作业项模型

[Display(Name = "Job number")]
[Required]
[ForeignKey("Job")]
public Int64 JobID { get; set; }
public virtual Job Job { get; set; }
作业项编辑视图

<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>

@LabelFor(model=>model.model.JobID)
@如果(@Model.Model.Job==null)
{
@TextBox(“Model.Job.Number”,String.Empty,new{@class=“csam change field”})
}
其他的
{                    
@Html.TextBoxFor(model=>model.model.Job.Number,新的{@class=“csam更改字段”})
}
@Html.HiddenFor(model=>model.model.JobID)
@Html.ValidationMessageFor(model=>model.model.JobID)
更新1:显示ModelState错误


正如Alan在下面指出的,当输入SubmitForm控制器操作时,ModelState立即无效。

我正在与OP一起处理此问题。事实证明,这是工作模式中的一个问题。作业上的CurrencyID导致ModelState错误,这非常奇怪,因为它甚至没有显示在视图中。在模型中仔细检查时,发现CurrencyID标记为int64?时不一致?但是具有必需的属性。这确实是一个必填字段,所以我将其更改为Int64,它工作正常。

我正在与OP合作解决此问题。事实证明,这是工作模式中的一个问题。作业上的CurrencyID导致ModelState错误,这非常奇怪,因为它甚至没有显示在视图中。在模型中仔细检查时,发现CurrencyID标记为int64?时不一致?但是具有必需的属性。这确实是一个必填字段,因此我将其更改为Int64,它工作正常。

请发布您的实际控制器代码。在屏幕截图中显示的是统一的POST操作,然后将视图模型转换为其他操作方法(顺便说一句,这是一个非常糟糕的想法)。问题很可能在于转换,但没有代码表示。@ChrisPratt我也在处理这个项目。问题立即出现在第一个SubmitForm控制器操作中,因为ModelState立即认为相关作业模型存在问题。即使手动设置了Job属性,ModelState中仍然会有来自初始绑定的错误。这是需要解决的问题,而不是交给它的下一个控制器操作。你能详细解释一下为什么一个统一的行动是一个不好的主意吗?我们这样做是因为我们已经构建了一个框架,所以它只编码一次,而不是针对每个控制器。请发布您的实际控制器代码。在屏幕截图中显示的是统一的POST操作,然后将视图模型转换为其他操作方法(顺便说一句,这是一个非常糟糕的想法)。问题很可能在于转换,但没有代码表示。@ChrisPratt我也在处理这个项目。问题立即出现在第一个SubmitForm控制器操作中,因为ModelState立即认为相关作业模型存在问题。即使手动设置了Job属性,ModelState中仍然会有来自初始绑定的错误。这是需要解决的问题,而不是交给它的下一个控制器操作。你能详细解释一下为什么一个统一的行动是一个不好的主意吗?我们这样做是因为我们已经构建了一个框架,所以它只编码一次,而不是针对每个控制器。