ASP.NET MVC 2 странное поведение - PullRequest
1 голос
/ 29 мая 2010

Недавно я установил VS 2010 Release (перенесенный из RC), и мое приложение MVC больше не работает. Более конкретно: у меня есть мастер с несколькими шагами для создания новой учетной записи клиента (мастер форм Jquery, но это не имеет большого значения). Каждый шаг содержит типичное частичное представление для каждой части учетной записи: компании, клиента, лицензии и т. Д. Когда я отправляю форму, я вижу действительно странную вещь в ModelState. Для компании существуют дубликаты ключей: с префиксом «Компания» и без него. Примерно так:

[6] Строка "Company.Phone"
[12] Строка "Телефон"

Мое состояние модели для всех этих ключей недопустимо, потому что на самом деле Company имеет значение null и проверка не пройдена Когда это был RC, таких ключей с префиксом «Company» не было. Поэтому эти ключи в ModelState с префиксом «Company» появились после того, как я установил VS Release. Вот мой код: Главный вид

<div id="registerSteps">
        <div id="firstStep" class="step">  
         <fieldset>       
          <legend><%=Html.Encode(Register.CustomerInfo) %></legend>
           <% Html.RenderPartial("CustomerInfo", ViewData["newCust"]); %>          
         </fieldset>
        </div>
        <div id="secondStep" class="step"> 
         <fieldset>       
          <legend><%=Html.Encode(Register.CompanyInfo) %></legend>       
          <% Html.RenderPartial("CompanyInfo", ViewData["newComp"]); %>
          </fieldset>
        </div>
        <div id="thirdStep" class="step">  
        <fieldset>       
          <legend><%=Html.Encode(Register.LicenceInfo) %></legend>         
          <% Html.RenderPartial("LicenceInfo", ViewData["newLic"]); %>
          </fieldset>
        </div>
        <div id="lastStep" class="step">
         <fieldset>       
          <legend><%=Html.Encode(Register.PrivacyStatement) %></legend>   
          <% Html.RenderPartial("PrivacyStatementInfo"); %>
          </fieldset>
        </div>        
        <div id="registerNavigation">                           
           <input class="navigation_button" value="Back" type="reset"/> 
           <input class="navigation_button" value="Next" type="submit"/>            
        </div> 
       </div>

Два частичных представления (чтобы показать, что они фактически идентичны): Компания:

<div id="dCompanyInfo">
 <div>
  <div>
  <%=Html.LocalizableLabelFor(company => company.Name, Register.CompanyName) %>
  </div>
  <div>
  <%=Html.TextBoxFor(company => company.Name) %>
  <%=Html.ValidationMessageFor(company => company.Name) %>
  </div>
 </div>
 <div>
  <div>
  <%=Html.LocalizableLabelFor(company => company.Phone, Register.Phone) %>
  </div>
  <div>
  <%=Html.TextBoxFor(company => company.Phone) %>
  <%=Html.ValidationMessageFor(company => company.Phone) %>
  </div>
 </div>
 <div>
  <div>
  <%=Html.LocalizableLabelFor(company => company.Fax, Register.Fax) %>
  </div>
  <div>
  <%=Html.TextBoxFor(company => company.Fax) %>
  <%=Html.ValidationMessageFor(company => company.Fax) %>
  </div>
 </div>
 <div>
  <div>
  <%=Html.LocalizableLabelFor(company => company.Size_ID, Register.CompanySize) %>
  </div>
  <div>
  <%=Html.ValueListDropDown(company => company.Size_ID, (CodeRoad.AQua.DomainModel.ValueList)ViewData["CompSize"], (string)ViewData["Culture"]) %>
  <%=Html.ValidationMessageFor(company => company.Size_ID) %>
  </div>
 </div>
 <div>
  <div>
  <%=Html.LocalizableLabelFor(company => company.Industry_ID, Register.Industry) %>
  </div>
  <div>
  <%=Html.ValueListDropDown(company => company.Industry_ID, (CodeRoad.AQua.DomainModel.ValueList)ViewData["Industry"], (string)ViewData["Culture"]) %>
  <%=Html.ValidationMessageFor(company => company.Industry_ID) %>
  </div>
 </div>
</div>

и для клиента

<div id="dCustomerInfo"> 
      <div>
       <div>
        <%=Html.LocalizableLabelFor(customer => customer.Email, Register.Email) %>
       </div>
       <div>
        <%=Html.TextBoxFor(customer => customer.Email) %>
        <%=Html.ValidationMessageFor(customer => customer.Email) %>
       </div>
      </div>
      <div>
       <div>
        <%=Html.LocalizableLabelFor(customer => customer.Male, Register.Gender) %>
       </div>
       <div>
        <%=Html.ListBoolEditor(customer => customer.Male, Register.Male, Register.Female, Register.GenderOptionLabel) %>
        <%=Html.ValidationMessageFor(customer => customer.Male) %>
       </div>
      </div>
      <div>
       <div>
        <%=Html.LocalizableLabelFor(customer => customer.FirstName, Register.FirstName) %>
        </div>
        <div>
        <%=Html.TextBoxFor(customer => customer.FirstName) %>
        <%=Html.ValidationMessageFor(customer => customer.FirstName) %>
        </div>
      </div>
      <div>
        <div>
        <%=Html.LocalizableLabelFor(customer => customer.LastName, Register.LastName) %>
        </div>
        <div>
        <%=Html.TextBoxFor(customer => customer.LastName) %>
        <%=Html.ValidationMessageFor(customer => customer.LastName) %>
        </div>
      </div>
      <div>
        <div>
        <%=Html.LocalizableLabelFor(customer => customer.Role_ID, Register.Role) %>
        </div>
        <div>
        <%=Html.ValueListDropDown(customer => customer.Role_ID, (CodeRoad.AQua.DomainModel.ValueList)ViewData["OrgRole"], (string)ViewData["Culture"])  %>
        <%=Html.ValidationMessageFor(customer => customer.Role_ID) %>
        </div>
      </div>   
 </div>

Есть несколько самодельных методов расширения, но они хорошо работали в предыдущей версии (VS RC). Html, который генерируется, также в порядке, никакой "Company.Phone" -подобный материал. Интересно, откуда взялись все эти ключи с «Компанией» и что я могу с этим сделать? Я ценю любое решение.

1 Ответ

0 голосов
/ 29 мая 2010

Я подозреваю, что произошли некоторые изменения в привязке модели, особенно в отношении шаблонов. Я предполагаю, что во время привязки модели элементы «Company.Phone» добавляются в состояние модели, потому что модель, которую вы используете для действия формы, содержит свойство Company с подвойствами, например Phone. К сожалению, ваш HTML не сгенерирован так, как ожидает связыватель модели, - он не знает, что свойство Phone на самом деле является подвойством свойства Company в модели. Я бы предложил рефакторинг вашего представления, чтобы использовать шаблоны вместо частичных представлений для генерации HTML. Механизм шаблонов создан для понимания иерархии модели и будет генерировать правильные свойства с префиксом в HTML, чтобы механизм связывания модели мог работать с возвращенными значениями формы.

У Брэда Уилсона есть замечательная серия статей о шаблонах , которые могут оказаться полезными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...