【问题标题】:Why can't Visual Studio 2012 format this valid Razor code为什么 Visual Studio 2012 不能格式化这个有效的 Razor 代码
【发布时间】:2014-11-13 13:52:48
【问题描述】:

所以我在构建和运行良好的视图中有一些有效的 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 如何格式化我的视图代码的屏幕截图

【问题讨论】:

    标签: c# asp.net-mvc visual-studio visual-studio-2012 razor


    【解决方案1】:

    看起来你很擅长使用括号来转义值,因此 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 本身就可以了。)

    【讨论】:

    • 感谢 Utopia,Razor 不喜欢 if 前面的 @
    • 我更新了我的问题,我开始使用@:“escape”来走得更远,仍然很想知道为什么我的一些代码向左浮动并且看起来很丑,不遵循父子结构
    • 这些行不应该需要 @: 转义,因为 Razor 会尝试自己识别标签。如果您一直遇到问题,您也可以尝试在&lt;text&gt; 标记中包装内容。 Razor 将其作为内容而不是代码进行处理。
    • 这让我回到了“预期表达式”格式错误。你怎么知道只有输入元素的行需要转义?
    • 好的,我的两个输入缺少一个右斜杠,看起来很不错,你怎么知道一个输入元素需要转义?
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2018-05-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多