最近,我安装了VS 2010 Release(从RC迁移),并且我的MVC应用程序不再起作用。 更具体:我有一个向导,其中包含创建新客户帐户的几个步骤(Jquery表单向导,但这并不重要)。 每个步骤都包含帐户的每个部分(公司,客户,许可证等)的类型化部分视图。当我提交表单时,在ModelState中看到了非常奇怪的东西。 公司有重复的键:带“ Company”前缀,不带前缀。 像这样:

[6]“ Company.Phone”字符串
[12]“电话”字符串

我的所有这些键的模型状态均无效,因为Company实际上为null且验证失败。 在RC时,没有这样的带有“ Company”前缀的键。 因此,在安装了VS Release之后,出现了ModelState中带有前缀“ Company”的这些键。 这是我的代码:主视图

<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

我怀疑在模型绑定方面,特别是在模板方面,存在一些更改。 我的猜测是,在模型绑定期间,“ Company.Phone”元素将添加到模型状态,因为用于表单操作的模型包含具有子属性(例如Phone)的Company属性。 不幸的是,您的HTML并不是按照模型绑定程序的预期生成的-它不知道Phone属性实际上是该模型上Company属性的子属性。 我建议重构您的视图以使用模板而不是部分视图来生成HTML。 建立模板引擎是为了了解模型层次结构,并将在HTML中生成正确的前缀属性,以便模型绑定程序可以使用返回的表单值。

布拉德·威尔逊(Brad Wilson) 在模板方面有一系列不错的文章 ,可能会有所帮助。

  ask by Voice translate from so

未解决问题?本站智能推荐:

4回复

ASP.NET的MVC

我已经从这里下载了MVC 2.0 ...但是它给我一个错误,表明MVC 2.0需要VS 2008 SP1 ...我已经安装了... 所以我在这里安装MVC有麻烦... 请帮助...
1回复

Asp.Net中的CkFinder-MVC2 MVC.NET

是否有人设法使CkFinder在MVC2或MVC3应用程序中工作? 否则,还有其他选择吗? 我需要授予用户访问文件夹的权限(每个用户都有自己的文件夹),以上传多个图像和CSS文件并创建子文件夹。 我已经在使用CkEditor,很想让CkFinder工作,但是我是MVC初学者,不知道从哪
1回复

从现有的asp.net项目移至mvc

我已经使用.net framework 4.0来设计我的Web项目,我想改善网站上的某些功能,因此决定在项目中使用MVC。 我研究了mvc,发现.net framework 3.5中的System.Web.Routing被.net framework 4.0中的System.Web包装。
4回复

ASP.NET新手:Webforms与MVC2

我是ASP.NET开发的新手,无法决定使用Webforms或MVC 2进行开发。无需考虑每种方法的优缺点。 我看到每个人的意见不一。 但对于之前没有ASP.NET或C#经验的人来说哪种方法最好? 如果你的答案是:学习两者,那么我应该先学习哪些? MVC 2还是Webforms?
1回复

使用MVC和asp.net创建数据模板

我目前正在评估将asp.net和MVC用于新项目(相对于Web部件或Web表单模式)。 虽然我真的很喜欢MVC模式以及从UI中提取代码的功能。 我有一个特定的requiremt来创建一个自定义控件,该控件以预定义的格式返回数据。 作为该项目的示例,我需要在列表框控件中返回数据,其中的lis
2回复

将.NET 3.5上的ASP.NET(MVC 2)迁移到.NET 4 #gotchas

我目前在.NET 3.5上有一个ASP.NET MVC 2应用程序,我想将其迁移到带有Visual Studio 2010的新.NET 4.0中。 原因是始终掌握这些东西总是很好-而且我真的很喜欢使用<%: %>和clean web.config :-)的新自动编码 。
1回复

在ASP.NET中将MVC与Webforms CMS结合使用时找不到MVC视图

我们在umbraco 4.1 cms(webforms)默认.net 3.5中建立了一个网站,在.net 4.0中我们使用MVC2.0建立了一些MVC工具和控件。 我设法让umbraco cms在.net 4.0中运行,并且一直在遵循本指南的各个部分(适用于mvc 1.0和umbraco
3回复

如何使用Ninject注入asp.net(mvc2)自定义成员资格提供程序?

好的,所以我几个小时都在研究这个问题。 我在这里发现了几个帖子,但实际上没有解决问题。 那么,让我再试一次...... 我有一个使用Ninject的MVC2应用程序和一个自定义成员资格提供程序。 如果我尝试使用ctor注入提供程序,我会收到一个错误:'没有为此对象定义无参数构造函