内部无法识别的Html语法如果是Razor MVC的条件

时间:2015-04-16 12:17:43

标签: c# html asp.net-mvc-4 razor

以下是我用于其中一个mvc视图的代码,在上述if条件中,html代码无法识别。

<table class="table">
        <tr class="row h4">
            <td>Task</td>
            <td>Parameter</td>
            <td>Active</td>
            <td><input type="button" class="btn btn-default" value="Add Mapping" /></td>
        </tr>
        @foreach (OrderTypeTaskParameterMapping mapping in Model.OrderTypeTaskParameterMappings)
        {
            <tr class="row">
                <td>
                    <select class="form-control">
                        @foreach (Task task in Model.Tasks)
                        {
                            <option value="@task.Id"
                                    @if (mapping.TaskId == task.Id)
                                    {
                                        selected="selected" **doesn't work**
                                    }
                                    >@task.Name</option>
                        }
                    </select>
                </td>
                <td>
                    <select class="form-control">
                        @foreach (Parameter p in Model.Parameters)
                        {
                            <option>@p.Name</option>
                        }
                    </select>
                </td>
                <td>
                    @if (mapping.Active)
                    {
                        <input type="button" class="btn btn-info" value="Active" />
                    }
                    else
                    {
                        <input type="button" class="btn btn-danger" value="InActive" />
                    }
                </td>
                <td><input type="button" class="btn btn-info" value="Save" /></td>
            </tr>
        }
    </table>

在执行上面的代码时,我收到一个错误: enter image description here

可能是什么原因?我认为这应该有效。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:0)

试试此代码

<option value="@task.Id" @(mapping.TaskId == task.Id ? "selected" : string.Empty)>

在{}内,您只能使用C#代码

答案 1 :(得分:0)

我认为它也可以使用条件属性:

<option value="@task.Id" selected="@(mapping.TaskId == task.Id)">

如果表达式的计算结果为false,则Razor将不会输出selected属性。

More on conditional attributes

关于原始问题,我认为问题与Razor如何从C#块告诉HTML有关。在您的代码中,您没有关闭option标记。您尝试打开它,使用代码块写入(或不写入)selected属性,然后将其关闭。

在代码块中,Razor期待一行代码或新的HTML标记。因为它不是HTML标记(没有尖括号),它会尝试将其解释为C#,因此missing ;消息。

这就是为什么父<tr>中的<td>@foreach(){}}标记正常工作的原因:因为它们可以被解释为新的HTML块。