在我的[HttpGet] Create Action
我有这个:
public ActionResult Create(int? id)
{
ViewBag.TestTypeID = new SelectList(db.codeTypes, "ID", "TestType");
OHealth oHealth = new OHealth();
oHealth.OID = Convert.ToInt32(id);
oHealth.DateEntered = DateTime.Today;
return View(oHealth);
}
现在,OID
是外键,而不是主键ID
。正如您所看到的,我没有为ID
分配任何值{only OID
。 ID
在数据库中自动递增。
以下是我的HTML为OID
和ID
的创建视图呈现的方式:
<input data-val="true" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="2" />
<input data-val="true" data-val-number="The field OID must be a number." data-val-required="The OID field is required." id="OID" name="OID" type="hidden" value="2" />
因此,当我点击“创建”时,ID
字段的值应为2
,因为它应该是1
,因为它将是数据库中的第一条记录。
我的ID
字段在未分配的情况下如何获得2
的值?
如果需要更多,请告诉我。
感谢任何帮助。
更新
这两个领域的Razor:
@Html.HiddenFor(model => model.ID)
@Html.HiddenFor(model => model.OID)
答案 0 :(得分:2)
MVC自动将参数绑定到模型状态。因此您的参数id
位于:
public ActionResult Create(int? id)
将自动放入Model.ID
(因为url params不区分大小写)。
您应该可以通过更改参数名称(以及相应的网址/操作定义)来确认这一点,例如:
public ActionResult Create(int? anotherid)
并将网址从/Create/2
更改为/Create?anotherid=2
这会自动发生,因此POST中的任何值都将自动具有与发布表单时相同的值,而无需您明确设置它们。在GET中,这是从参数中发生的。
修复方法是添加ModelState.Clear()
:
public ActionResult Create(int? id)
{
if (!ModelState.IsValid) return;
ModelState.Clear();
这将在重新生成视图字段时停止自动重新绑定。
重新绑定在视图生成后发生,所有字段值都从 ModelState 重新插入。通过清除模型状态,可以阻止这种情况发生。