为什么Visual Studio 2012无法格式化这个有效的Razor代码?

4

我有一些有效的Razor语法代码在视图中,可以成功地构建和运行。然而,在Visual Studio 2012中,代码无法正确格式化,Razor似乎在解析此文档时很“脆弱”,当我使用CTRL + K + D自动格式化代码时,一些内容向左浮动,难看,不能按嵌套的父子结构进行格式化。我无法在第二个if条件中添加@,这可能会修复向左浮动的HTML内容。

@foreach (var customField in Model.CustomFields)
{
<tr>
    <td>
        @customField.label
    </td>
    <td>
        <div class="col-md-4 padding-0">
            @switch (customField.custom_field_type_id)
            {
                case Constants.CustomFieldType.checkbox:
                    foreach (var opt in customField.custom_field_options.Select((x, i) => new { Data = x, Index = i }))
                    {
                        var optValue = customField.custom_field_values.FirstOrDefault(item => item.custom_field_option_id == opt.Data.custom_field_option_id && item.custom_field_id == customField.custom_field_id);

                <div class="checkbox">
                    <label>@opt.Data.custom_field_option_value</label>

                    @if (optValue != null)
                    {
                        var optName = customField.custom_field_id + "_" + opt.Data.custom_field_option_id + "_" + optValue.custom_field_value_id;
                        <input type="checkbox" id="CustomFieldEdit_@opt.Data.custom_field_option_id" name="CustomFieldEdit_@optName" @(optValue.value.ToLower() == "true" ? "checked" : "") />
                        <input type="hidden" id="CustomFieldOrig_@opt.Data.custom_field_option_id" name="CustomFieldOrig_@optName" value="@optValue.value" />
                    }
                    else
                    {
                        var optName = customField.custom_field_id + "_" + opt.Data.custom_field_option_id + "_0";
                        <input type="checkbox" id="CustomFieldEdit_@(opt.Data.custom_field_option_id)" name="CustomFieldEdit_@optName" @(opt.Data.is_checked ? "checked" : "") />
                    }
                </div>
                    }

                    break;

                         case Constants.CustomFieldType.text_input:
                    var textinputVal = customField.custom_field_values.FirstOrDefault();
                    if (textinputVal != null)
                    {
                        var textInputName = customField.custom_field_id + "_0_" + textinputVal.custom_field_value_id;
                <input type="text" id="CustomFieldEdit_@(customField.custom_field_id)" name="CustomFieldEdit_@(textInputName)" value="@textinputVal.value" class="form-control" />
                <input type="hidden" id="CustomFieldOrig_@(customField.custom_field_id)" name="CustomFieldOrig_@(textInputName)" value="@textinputVal.value" class="form-control" />
                    }
                    else
                    {
                        var textInputName = customField.custom_field_id + "_0_0";
                <input type="text" id="CustomFieldEdit_@(customField.custom_field_id)" name="CustomFieldEdit_@(textInputName)" class="form-control" />
                    }
                    break;

            }
        </div>
    </td>
</tr>

查看 Visual Studio 2012 Professional 格式化我的视图代码的屏幕截图:

enter image description here

1个回答

2

看起来你在使用括号转义值时非常好,以便Razor不会将它们解析为电子邮件地址,但似乎有一些需要括号的地方没有转义。请尝试以下方法:

@if (optValue != null)
{
    <input type="checkbox" id="CustomFieldEdit_@(opt.Data.custom_field_option_id)" name="CustomFieldEdit_@(customField.custom_field_id)_@(opt.Data.custom_field_option_id)_@(optValue.custom_field_value_id)" @(optValue.value.ToLower() == "true" ? "checked" : "")>
    <input type="hidden" id="CustomFieldOrig_@(opt.Data.custom_field_option_id)" name="CustomFieldOrig_@(customField.custom_field_id)_@(opt.Data.custom_field_option_id)_@(optValue.custom_field_value_id)" value="@optValue.value">
}
else
{

    <input type="checkbox" id="CustomFieldEdit_@(opt.Data.custom_field_option_id)" name="CustomFieldEdit_@(customField.custom_field_id)_@(opt.Data.custom_field_option_id)_0" @(opt.Data.is_checked ? "checked" : "")>
}

更新以回答更新的问题

尝试像这样做。

<div class="checkbox">
    <label>@opt.Data.custom_field_option_value</label>


    @if (optValue != null)
    {
        var optName = customField.custom_field_id + "_" + opt.Data.custom_field_option_id + "_" + optValue.custom_field_value_id;
        <input type="checkbox" id="CustomFieldEdit_@opt.Data.custom_field_option_id" name="CustomFieldEdit_@(optName)" @(optValue.value.ToLower() == "true" ? "checked" : "") />
        <input type="hidden" id="CustomFieldOrig_@opt.Data.custom_field_option_id" name="CustomFieldOrig_@(optName)" value="@(optValue.value)" />
    }
    else
    {
        var optName = customField.custom_field_id + "_" + opt.Data.custom_field_option_id + "_0";
        <input type="checkbox" id="CustomFieldEdit_@(opt.Data.custom_field_option_id)" name="CustomFieldEdit_@(optName)" @(opt.Data.is_checked ? "checked" : "") />
    }

</div>

针对第三个问题更新的编辑

每次出现的主要问题是,Razor错误地将您代码的某些部分误认为是格式正确的电子邮件地址,尽管这对人类来说是显而易见的。请确保任何具有紧接在纯HTML /文本之前的@的内容都被括号括起来。

做:

CustomFieldEdit_@(customField.custom_field_id)

而不是

CustomFieldEdit_@customField.custom_field_id

@customField.custom_field_id本身就可以了。)


这些行本来不需要 @: 转义,因为 Razor 会试图自己识别标签。如果你仍然遇到麻烦,你也可以尝试用 <text> 标签包装内容。Razor 处理它作为内容而不是代码。 - UtopiaLtd
这让我回想起了遇到“表达式预期”格式错误的情况。你是如何知道只有带有输入元素的那一行需要转义的? - Brian Ogden
好的,我在两个输入框中漏了一个闭合斜杠,现在看起来很好。你怎么知道其中一个输入元素需要转义? - Brian Ogden
与以前一样,看起来仍然没有正确地转义东西,例如textInputName等变量实际上没有被使用。要确保任何涉及将文本直接连接到经Razor处理的值(例如CustomFieldEdit_@customField.custom_field_id)的内容都需要进行Razor部分转义。否则,邮件接收者是在customField.custom_field_id域名下的CustomFieldEdit_。 - UtopiaLtd
谢谢Utopia,我已经在所有地方更新并添加了CustomFieldEdit_@(customField.custom_field_id)语法,但是我的switch语句的第二个情况格式仍然很奇怪。 - Brian Ogden
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接