2010-05-29 5 views
1

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

[6] «Company.Phone» строка
[12] «Телефон» строка

Моя модель состояния для всех этих ключей не действует, так как компания фактически утратившим проверка не выполняется. Когда это был RC, таких ключей с префиксом «Компания» не было. Итак, эти ключи в ModelState с префиксом «Компания» появились после установки 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». Поэтому мне интересно, откуда взялись все эти ключи с «Компанией» и что я могу с этим сделать? Я ценю любое решение.

ответ

0

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

У Брэда Уилсона есть хорошая серия articles on templating, которая может быть полезна.

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