我在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/

10-15 16:16