Обновление одного и того же свойства в двух местах формы MVC

У меня есть два поля в форме MVC3, которые должны представлять одно и то же значение. Если один обновлен, он должен обновить другой и отобразить правильное значение (требования Gotta love). По понятным причинам поле (со вторым на странице) не обновляется должным образом. Есть ли способ добиться того, что мне нужно?

Например:

Первый пример

 <li class="identifier-controls"            @Model.IdentifierConfigurator.GenerateDataAttributes("ssn")>
        @Html.TextFieldFor("Social Security Number", m => m.SocialSecurityNumber).SSN()
    </li>

may appear twice on that form (In two different spots). (At this point, both of the controls have the same ID and name)

OR:

Второй пример

    <li class="identifier-controls"            @Model.IdentifierConfigurator.GenerateDataAttributes("ssn")>
       @Html.TextFieldFor("Social Security Number", m => m.SocialSecurityNumber).SSN()
    </li>

а также

    <li class="identifier-controls"            @Model.IdentifierConfigurator.GenerateDataAttributes("ssn")>
       @Html.TextFieldFor("Social Security Number", m => m.Person.Description.SSN).SSN()
    </li>

появится в форме. На данный момент идентификаторы для ввода различны, но он будет обновляться только на одном из них.

Вот сгенерированный HTML:

<ol class="field-list display">

  <li id="party-name"><span class="label">Name</span><span id="FormalDisplayName" class="value" style="width:140px">Guy, Bad</span></li>

  <li><span class="label">Aliases</span><span id="AliasNames" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Status</span><span id="PartyStatusName" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Gender</span><span id="Description_Gender" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Juvenile</span><span id="Description_IsJuvenile" class="value" style="width:140px">No</span></li>

  <li><span class="label">Ethnicity</span><span id="Description_Ethnicity" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Residential Status</span><span id="Description_ResidentialStatus" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Marital Status</span><span id="Description_MaritalStatus" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Religion</span><span id="Description_Religion" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Citizenship</span><span id="Description_Citizenship" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Birth City</span><span id="Description_BirthCity" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Date of Birth</span><span id="Description_BirthDate" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Date of Death</span><span id="Description_DeathDate" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Est. Age at Incident</span><span id="Description_EstimatedAgeAtIncident" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Adoption Date</span><span id="Description_AdoptionDate" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Multiple Birth</span><span id="Description_MultipleBirthName" class="notentered" style="width:140px">Not entered</span></li>

  <li><span class="label">Email</span><span id="Description_Email" class="notentered" style="width:140px">Not entered</span></li>



    <li><span class="label">Identifiers</span><span id="SuspectIdentifiersDisplay" class="value" style="width:400px">Prof<span class='value-display'>&nbsp;123</span><span class='separator'>&nbsp;|&nbsp;</span>FBI<span class='value-display'>&nbsp;123</span><span class='separator'>&nbsp;|&nbsp;</span>SSN<span class='value-display'>&nbsp;222-22-2222</span><span class='separator'>&nbsp;|&nbsp;</span>ITN<span class='value-display'>&nbsp;123</span><span class='separator'>&nbsp;|&nbsp;</span>BCI<span class='value-display'>&nbsp;13</span><span class='separator'>&nbsp;|&nbsp;</span>ID<span class='value-display'>&nbsp;123</span><span class='separator'>&nbsp;|&nbsp;</span>DL<span class='value-display'>&nbsp;123</span><span class='separator'>&nbsp;|&nbsp;</span></span></li>

</ol>

Единственная разница между этим HTML-кодом (это HTML-код из второго примера) и HTML-кодом, сгенерированным в первом примере, заключается в том, что два элемента управления имеют одинаковый идентификатор и имя. Вот что происходит в методе контроллера, который вызывается html-помощником BeginRouteForm при вызове отправки:

общественное обновление ActionResult (int partyId, данные FormCollection) { var party = Party.Find (partyId).OrNotFound(); var vm = новая модель PartyEditViewModel(party.Case, party);

  try
  {
    UpdateModel(vm, data);

    return JsView("Update.js", party);
  }
  catch (UpdateModelException)
  {
    return JsView("Edit.js", vm);
  }
}

person The Sheek Geek    schedule 09.12.2011    source источник
comment
Не могли бы вы также опубликовать html, который генерируется при загрузке вашей страницы? Кроме того, вы ожидаете, что изменение произойдет после отправки формы, или вы ищете что-то более динамичное, например, если я отредактирую одно текстовое поле, другое тоже изменится? Пожалуйста, поправьте меня, если я не понимаю ваших требований.   -  person mreyeros    schedule 10.12.2011
comment
Я просто ищу значения для изменения ПОСЛЕ отправки формы. В нашем приложении после отправки формы происходит обработка, а затем пользователь попадает на страницу сведений, которая просто показывает обновленные значения формы как доступные только для чтения. При повторном нажатии кнопки редактирования оба элемента управления выше в форме должны содержать одно и то же значение. Это должно происходить независимо от того, какое из полей обновляется.   -  person The Sheek Geek    schedule 10.12.2011
comment
Хорошо, а в действии вашего контроллера какие параметры вы отправляете своему почтовому действию, которое обрабатывает обновление?   -  person mreyeros    schedule 10.12.2011
comment
ОК, я предполагаю, но поскольку оба элемента управления имеют одно и то же имя и идентификатор при обновлении модели, потенциально он может захватить только первый элемент управления для привязки модели. Также вы можете подтвердить, если при обновлении модели из первого элемента управления отображается ли на дисплее только для чтения новое значение в обоих элементах управления.   -  person mreyeros    schedule 10.12.2011
comment
Параметры — это имена, которые вы видите в добавленном фрагменте html. Все они публикуются, а затем метод контроллера (также добавленный) выполняет обновление.   -  person The Sheek Geek    schedule 10.12.2011
comment
Да, как только я действительно получаю значение для обновления, оба места в форме показывают правильное значение. Теперь я согласен с тем, что один и тот же идентификатор/имя — это плохо и может вызывать проблемы, но во втором примере это не так. Если, конечно, форма как-то не знает, что это то же самое без того же идентификатора/имени.   -  person The Sheek Geek    schedule 10.12.2011


Ответы (1)


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

person mreyeros    schedule 09.12.2011
comment
Это именно то, что я говорю - person The Sheek Geek; 09.12.2011
comment
Хорошо, я думаю, что понял это. Проблемы связаны с тем, что есть два поля с одинаковым именем/идентификатором (как вы упомянули выше). Кажется, что поскольку значения заполняются при нажатии кнопки редактирования, первый элемент управления со значением в нем будет значением, которое он использует для обновления. Поэтому, если я изменю значение первого появившегося элемента управления, то обновление будет работать идеально, и вы заметите изменение. Если второй элемент управления обновляется, первый элемент управления по-прежнему имеет старое значение, и это значение, поэтому обновление не будет замечено. Спасибо! - person The Sheek Geek; 10.12.2011
comment
Очень рад, что вы смогли разобраться. - person mreyeros; 10.12.2011
comment
Я думаю, что достойный способ обойти это — установить событие размытия для обоих полей, чтобы при изменении одного оно автоматически обновляло другое поле, чтобы это больше не было проблемой. - person The Sheek Geek; 10.12.2011
comment
Да, вам нужно будет использовать код на стороне клиента для управления изменением значения обоих элементов управления. - person mreyeros; 10.12.2011