2016-09-13 2 views
0

В моем [HttpGet] Create Action я это:Мой ID поле получает значение, когда оно не должно быть

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 любое значение .. только OID. ID автоматически добавляется в базу данных.

Вот как мой HTML делает для моего Create View для 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, если это не было назначено?

Сообщите мне, если потребуется больше.

Любая помощь приветствуется.

ОБНОВЛЕНИЕ

Бритва для тех полей 2:

@Html.HiddenFor(model => model.ID)  
@Html.HiddenFor(model => model.OID) 
+0

@ freedomn-m см. Обновленный. –

+0

Это из-за этого 'public ActionResult Create (int? Id)'. Прочтите секцию, чтобы дать объяснение. –

+0

@ freedomn-m В моем классе «OHealth» у меня есть пустой конструктор. –

ответ

2

MVC автоматически связывает параметры в ModelState. Так что ваш параметр id в:

public ActionResult Create(int? id) 

будет автоматически введен в Model.ID (как URL PARAMS нечувствительны к регистру).

Вы должны быть в состоянии подтвердить это, изменив имя параметра (и соответствующий URL/определение действия), например:

public ActionResult Create(int? anotherid) 

и изменить URL из /Create/2 в /Create?anotherid=2

Это происходит автоматически, так что любые значения в POST будут автоматически иметь те же значения, которые были у них, когда форма была опубликована без необходимости их явно устанавливать. В GET это происходит из параметров.

Исправление добавить ModelState.Clear():

public ActionResult Create(int? id) 
{ 
    if (!ModelState.IsValid) return; 

    ModelState.Clear(); 

это остановит автоматическое переприсваивания когда вид поля восстанавливаются.

Повторное связывание происходит после создания представления, все значения полей повторно вставлены из ModelState. Очищая модельное состояние, вы перестаете это делать.

+0

Это сработало! Спасибо за объяснение! Большое спасибо. –

Смежные вопросы