以下是我用于其中一个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>
在执行上面的代码时,我收到一个错误:
可能是什么原因?我认为这应该有效。我在这里错过了什么吗?
答案 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块。