我在App_Code目录下的文件中有一个辅助方法。该方法在MVC 3中可以很好地工作,但是升级到MVC 4后就不能了。它在第一个@if()块上失败了...
[编辑]这看起来像是Razor引擎中的解析错误。当我所有的对象及其属性都不为空时,出现“对象引用未设置为对象实例”错误。我想我必须直接去微软。
[编辑]错误消息是旧的“对象引用未设置为对象的实例”。这很奇怪,因为条件中的每个对象AND属性都是有效的,并且不为null。
@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {
<ul class="socialMedia inlineList">
@if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
{
var tHandle = "@" + contactTwitterHandle.Handle;
<li class="twitter">
<a class="btn" href="http://www.twitter.com/@contactTwitterHandle.Handle" target="_blank">
<i></i>
<span class="label">@tHandle</span>
</a>
@if(contactTwitterHandle.FollowerCount.HasValue)
{
<div class="count" id="c">
<i></i>
<u></u>
<span class="followers" title="@contactTwitterHandle.FollowerCount.Value followers">@FollowerCount(contactTwitterHandle.FollowerCount.Value)</span>
</div>
}
</li>
<script type="text/javascript">
$("#twitter").click(function () {
window.location.href = '@(helper.BuildUrlFromExpression<TenantController>(t => t.LinkTwitterAccount()))';
})
</script>
}
@if (contactFacebookAccount != null && contactFacebookAccount.IsValid.HasValue && contactFacebookAccount.IsValid.Value)
{
<li class="facebook">
<a class="btn" href="@contactFacebookAccount.Url" target="_blank">
<i></i>
<span class="label">@contactFacebookAccount.Name</span>
</a>
@if(contactFacebookAccount.FriendCount.HasValue)
{
<div class="count" id="c">
<i></i>
<u></u>
<span class="followers" title="@contactFacebookAccount.FriendCount.Value friends">@FriendCount(contactFacebookAccount.FriendCount.Value)</span>
</div>
}
</li>
}
</ul> }
[更新]
我更改了代码,现在变得更陌生了。我在行上收到与上述相同的错误:
var tLink = "http://www.twitter.com/" + contactTwitterHandle.Handle;
contactTwitterHandle和contactTwitterHandle.Handle都不为空。
@helper RenderConnectButton(System.Web.Mvc.HtmlHelper helper, ContactTwitterHandleDto contactTwitterHandle, ContactFacebookAccountDto contactFacebookAccount) {
<ul class="socialMedia inlineList">
@if (contactTwitterHandle != null && contactTwitterHandle.IsValid.HasValue && contactTwitterHandle.IsValid.Value)
{
var tHandle = "@" + contactTwitterHandle.Handle;
var tLink = "http://www.twitter.com/" + contactTwitterHandle.Handle;
<li class="twitter">
<a class="btn" href="@tLink" target="_blank">
<i></i>
<span class="label">@tHandle</span>
</a>
@if(contactTwitterHandle.FollowerCount.HasValue)
{
<div class="count" id="c">
<i></i>
<u></u>
<span class="followers" title="@contactTwitterHandle.FollowerCount.Value followers">@FollowerCount(contactTwitterHandle.FollowerCount.Value)</span>
</div>
}
</li>
<script type="text/javascript">
$("#twitter").click(function () {
window.location.href = '@(helper.BuildUrlFromExpression<TenantController>(t => t.LinkTwitterAccount()))';
})
</script>
}
@if (contactFacebookAccount != null && contactFacebookAccount.IsValid.HasValue && contactFacebookAccount.IsValid.Value)
{
<li class="facebook">
<a class="btn" href="@contactFacebookAccount.Url" target="_blank">
<i></i>
<span class="label">@contactFacebookAccount.Name</span>
</a>
@if(contactFacebookAccount.FriendCount.HasValue)
{
<div class="count" id="c">
<i></i>
<u></u>
<span class="followers" title="@contactFacebookAccount.FriendCount.Value friends">@FriendCount(contactFacebookAccount.FriendCount.Value)</span>
</div>
}
</li>
}
</ul>
}
最佳答案
我找到了解决此问题的方法,但首先有了一段历史。对于这个特定的MVC项目,我们决定逐渐开始实现Razor。该应用程序具有很多“模态”区域,可通过进行AJAX调用来填充它们以获取局部 View 。这些局部 View 是第一个实现为Razor View 的 View 。后来,我们想使用Razor部分 View 在标准ASPX View 页面中实现一项新功能,但是ASPX View 引擎无法呈现部分Razor View ,因此我不使用Razor View ,而是在App_Code文件夹中添加了MVC帮助程序文件,呈现特征的方法。升级到MVC4后,此方法是导致错误的原因。我正在将具有此方法呈现的功能的页面转换为Razor View 页面,因此我今天意识到,我所要做的就是将代码从该方法移至Razor局部 View 中。 这可以解决问题,但是,我仍然认为这是Razor引擎中使用辅助方法进行渲染的错误。
关于asp.net-mvc - 从MVC 3升级到4后, Razor 助手方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10623154/