【问题标题】:Statement inside If block executing even when condition is false即使条件为假,If 块中的语句也会执行
【发布时间】:2014-01-09 19:27:19
【问题描述】:
@model Portal.Models.MessageModel

<link href="~/Content/jquery.wysiwyg.css" rel="stylesheet" />
<script type="text/javascript" src="~/Scripts/jquery-2.0.3.js"></script>
<script src="~/Scripts/jquery-migrate-1.2.1.js"></script>
<script src="~/scripts/jquery.unobtrusive-ajax.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.wysiwyg.js"></script>
<script type="text/javascript" src="~/Scripts/wysiwyg-controls/wysiwyg.image.js"></script>
<script type="text/javascript" src="~/Scripts/wysiwyg-controls/wysiwyg.link.js"></script>
<script type="text/javascript" src="~/Scripts/wysiwyg-controls/wysiwyg.table.js"></script>
<script type="text/javascript" src="~/Scripts/wysiwyg-controls/wysiwyg.cssWrap.js"></script>
<script type="text/javascript" src="~/Scripts/wysiwyg-controls/wysiwyg.colorpicker.js"></script>

<script type="text/javascript">
    (function($) {
        $(document).ready(function() {
            $('#messagearea').wysiwyg({
                initialContent: function () {
                    var inittext = "";
                    @{if (Model != null)
                       {
                           <text>inittext = '@Model.MessageText';</text>
                       }
                    }
                        return inittext;
                }
            });
        });
    })(jQuery);
</script>
    <table id="compose-table" style="border-spacing:0 0; max-width: 1200px; min-width: 450px;box-shadow: 0 0 5px 2px #cfcfcf; width:auto; background-color:white">
        <tbody>
            <tr >
                <td style="box-shadow: inset 0 0 10px #383838;">
                    <form>
                        <div id="destinations" style="border-bottom: 1px solid #cfcfcf; padding: 12px 1px 12px 2px; ">                            

                            **<input name="to" spellcheck="false" autocomplete="false" autocapitalize="false" autocorrect="off" style="padding-left: 8px; background-color:transparent; width:1078px; resize:none; border: none;" placeholder="To" onfocus="displayCCandBCC" value="@Model.From"/>**
                        </div>
                        <div id="addressdiv" style="display: none">
                            <table>
                                <tbody>
                                    <tr id="cc" style="display: none"></tr>
                                    <tr id="bcc" style="display: none"></tr>
                                </tbody>
                            </table>
                        </div>

                        <div id="subjectdiv" style="border-bottom: 1px solid #cfcfcf; padding : 12px 1px 12px 2px; ">
                        @{if (Model == null){
                            <input name="subject" style="padding-left: 8px; width: 1078px; border: none; background-color: inherit" placeholder="Subject" />
                          }
                          else
                          {
                            <input name="subject" style="padding-left: 8px; width: 1078px; border: none; background-color: inherit" placeholder="Subject" value="@String.Concat("re: ", Model.Subject)" />
                          }
}
                        </div>
                        <textarea id="messagearea" style="min-height:300px; width:100%; padding:0 0 0 0"></textarea>
                    </form>
                </td>
            </tr>
        </tbody>
</table>

此脚本在 cshtml razor 视图中,进入视图 Model 为 null,但出现 null 引用异常:

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

Source Error: 

Line 20:       {
Line 21:           Response.Write("inittext = '@Model.MessageText';");
Line 22:       }
Line 23:       return inittext;
Line 24:   }

源文件:d:\Projects\Patient Portal\Portal.MVC\Views\Message\Compose.cshtml 行:22

为什么即使 if 条件为假,response.write 仍然在执行,为什么异常指向第 22 行而不是第 21 行?

【问题讨论】:

  • 错误通常指向后面的行,或者将代码超出范围的行。
  • 不需要去掉“Model”前面的“@”吗?
  • @David 我两种方法都做过,没什么区别
  • 最后通过删除大块代码找到它,它在 按钮上,有一个未经检查的对 @Model.From 的引用导致错误,完全不是错误消息指示的位置。

标签: c# jquery razor asp.net-mvc-5


【解决方案1】:

我没有 MVC5 来测试这个,但我认为你的 Response 对象是空的,你应该像这样创建你的动态 javascript:

@if (Model != null)
{
    <text>inittext = '@Model.MessageText';</text>
}

另外,请确保 Model.MessageText 已正确转义,以使其内容不会导致 javascript 错误。

【讨论】:

  • 我最初有它并将其更改为响应,因为我认为 ... 标签可能发生了一些奇怪的事情。
  • 如果是这种情况,那么您的错误就在其他地方。您在 cshtml 文件顶部有正确的 @model 声明吗?
【解决方案2】:

因为你在一个 JS 代码块中,你需要使用显式的 CSHTML 开始标签来做你的 if。

【讨论】:

  • 我尝试将其包装在 @{...} 中,但没有任何帮助。
  • 您可能必须将其存储到 JS 脚本块开头的变量中...我记得不得不做这样的事情,因为 Razor 解释器会混淆...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多