我的ID字段在不应该的时候得到一个值

时间:2016-09-13 19:46:21

标签: c# asp.net-mvc

在我的[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 OIDID在数据库中自动递增。

以下是我的HTML为OIDID的创建视图呈现的方式:

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

1 个答案:

答案 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 重新插入。通过清除模型状态,可以阻止这种情况发生。