C#Razor查看错误 - 预期大括号

时间:2018-01-12 20:54:29

标签: c# asp.net asp.net-mvc razor razorengine

道歉,如果这对你们中的一些人(如果不是每个人)都很容易。我是Razor视图中的新手,所以非常感谢您的帮助和支持。

我收到以下错误:

  

}预期

第1行中的

。这里:@model ForExample.Models.DataClass

我的剃刀代码:

@model ForExample.Models.DataClass

@{
    ViewBag.Title = "Edit: " + @Model.Title;
}

@if(Model != null)
{

     if (@ViewBag.Message != "")
     {      
                var messageString = @ViewBag.Message;

                if (messageString.Contains("Successfully"))
                {
                    <h3 style="color:green;">@ViewBag.Message</h3>
                }
                if(!messageString.Contains("Successfully"))
                {
                    <h3 style="color:red;">@ViewBag.Message</h3>
                }
     }

    <div>
        <form method="post">
            @Html.HiddenFor(model => model.Id)
            <h4>@Html.LabelFor(ex => ex.Title)</h4>
            <input type="text" id="Title" name="Title" class="form-control" value="@Model.Title" />
            <h4>@Html.LabelFor(ex => ex.Tags)</h4>
            <input type="text" id="Tags" name="Tags" class="form-control" value="@Model.Tags" />
            <h4>@Html.LabelFor(ex => ex.Description)</h4>
            <textarea id="Description" name="Description" class="form-control" rows="10" cols="100">@Model.Description</textarea><br />
            <button value="Example" id="Edit" class="btn btn-success btn-lg"> Save Changes </button>
        </form>
    </div>
}

知道我可能缺少什么吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

在某些构造之后,您不必指定切换到razor(@字符)

@if(Model != null)
{
    if (@ViewBag.Message != "") -> (1)
    {      
        var messageString = @ViewBag.Message;  -> (2)

        if (messageString.Contains("Successfully")) -> (3)
                <h3 style="color:green;">@ViewBag.Message</h3> -> (4)

在第一个@if之后,您处于Razor标记中,因此:

  1. 您不需要@,因为您还在Razor
  2. 与第1点相同
  3. 如您所见,您仍然在Razor(否则,这将是无效的HTML
  4. 您需要@,因为您已移至HTML
  5. 因此,您修复的View应如下所示:

    @model ForExample.Models.DataClass
    
    @{
        ViewBag.Title = "Edit: " + Model.Title;
    }
    
    @if(Model != null)
    {
        string message = ViewBag.Message as string;
        if (!string.IsNullOrEmpty(message))
        {      
            if (message.Contains("Successfully"))
            {
                <h3 style="color:green;">@message</h3>
            }
            else
            {
                <h3 style="color:red;">@message</h3>
            }
        }
    }
    

    您可能需要在检查Model.Title后检查首次使用Model != null和行的原因。

答案 1 :(得分:1)

这一行

var messageString = @ViewBag.Message;

已经在代码块内(由if条件语句打开)。所以你不需要额外的@

额外的逐字@是导致错误的原因。删除它,一切都应该正常。

您可能希望执行null而不是检查iewBag.Message的空字符串。当ContainsViewBag.Message时,调用NULL方法会引发异常( 无法对空引用执行运行时绑定

@if(Model != null)
{
    if (ViewBag.Message != null)
    {      
        var messageString = ViewBag.Message;

        if (messageString.Contains("Successfully"))
        {
            <h3 style="color:green;">@messageString</h3>
        }
        if(!messageString.Contains("Successfully"))
        {
            <h3 style="color:red;">@messageString</h3>
        }
    }
    <div>
        <form method="post">
            @Html.HiddenFor(model => model.Id)
            <h4>@Html.LabelFor(ex => ex.Title)</h4>
            <input type="text" id="Title" name="Title" class="form-control" value="@Model.Title" />
            <h4>@Html.LabelFor(ex => ex.Tags)</h4>
            <input type="text" id="Tags" name="Tags" class="form-control" value="@Model.Tags" />
            <h4>@Html.LabelFor(ex => ex.Description)</h4>
            <textarea id="Description" name="Description" class="form-control" rows="10" cols="100">@Model.Description</textarea><br />
            <button value="Example" id="Edit" class="btn btn-success btn-lg"> Save Changes </button>
        </form>
    </div>
}

我还注意到,您正在创建输入元素并从模型的属性设置值属性值。您可以考虑Html.TextBoxFor辅助方法,它将为您生成相同的

@Html.TextBoxFor(a=>a.Title,new { @class="form-control"})