Несовпадающие фигурные скобки в блоке кода C# веб-страниц ASP.NET

Блок If Else в разделе «Подключиться к MPP и найти существующие идентификаторы драйверов» вызывает несогласованные фигурные скобки в моем основном блоке Razor. Я знаю, что что-то упускаю, но не могу понять. Отладчик игнорирует последнюю фигурную скобку, рассматривая предпоследнюю фигурную скобку как совпадающую с открывающей фигурной скобкой @{.

@{
Layout = "~/Shared/_Layout.cshtml";
Page.Title = "Register";

// Setup field validation
Validation.RequireField("driverfirstname", "Cannot be blank.");
Validation.RequireField("driverlastname", "Cannot be blank.");
Validation.RequireField("driverssn", "Cannot be blank.");

// Initialize variables
var driverfirstname = "";
var driverlastname = "";
var driverssn = "";

// If validation is OK    
if (IsPost && Validation.IsValid())
{
    driverfirstname = @Request.Form["driverfirstname"];
    driverlastname = @Request.Form["driverlastname"];
    driverssn = @Request.Form["driverssn"];

    // Create Driver ID and Password
    string first = driverfirstname.Substring(0, 3);
    string last = driverlastname.Substring(0, 3);
    string lastFour = driverssn.Substring(7, 4);
    string drivercodetest = (last + first).ToUpper();

    // Connect to MPP and look for existing Driver IDs
    var dbs = Database.Open("other_db");
    var drivercodempp = dbs.Query("SELECT mpp_id FROM profile WHERE mpp_id = @drivercodetest");
    var drivercode = "";

    if (drivercodempp == null)
    {
        drivercode = (last + first).ToUpper();
    }
    else if (drivercodempp.Contains("01"))
    {
        drivercode = (last + first).ToUpper() + "02";
    }
    else if (drivercodempp.Contains("02"))
    {
        drivercode = (last + first).ToUpper() + "03";
    }
    else if (drivercodempp.Contains("03"))
    {
        drivercode = (last + first).ToUpper() + "04";
    }
    else if (drivercodempp.Contains("04"))
    {
        drivercode = (last + first).ToUpper() + "05";
    }
    else if (drivercodempp.Contains("05"))
    {
        drivercode = (last + first).ToUpper() + "06";
    }
    else
    {
        drivercode = (last + first).ToUpper() + "07";
    }

    // Submit to database
    var dbi = Database.Open("MainDB");
    var insertCommand = "INSERT INTO driver (drivercode, driverfirstname, driverlastname, driverssn) VALUES(@0, @1, @2, @3)";
    dbi.Execute(insertCommand, drivercode, driverfirstname, driverlastname, driverssn);

    Response.Redirect("~/confirm_register");
}

}


person indyitman    schedule 19.09.2013    source источник


Ответы (2)


В строке if (IsPost && Validation.IsValid()) отсутствует закрывающая фигурная скобка.

person Dai    schedule 19.09.2013
comment
Я проверил это. У меня есть две закрывающие скобки после Response.Redirect..., одна для IsPost... и одна для блока Razor. - person indyitman; 19.09.2013
comment
Ошибка 1 } ожидается c:\Users\indyitman\AppData\Local\Temp\Temporary ASP.NET Files\root\1a7fde3c\2913116c\App_Web_rt5b21nh.6.cs 2148 - person indyitman; 19.09.2013
comment
Откройте этот сгенерированный файл .cs в VS и посмотрите там. У вас может быть другой код, вызывающий проблемы. Соответствие скобок имеет тенденцию иметь проблемы. - person Dai; 19.09.2013

Я тоже только что столкнулся с этой проблемой. Я думаю, что ваша проблема связана с вашими переменными @Request. Попробуйте избавиться от знака @ перед именем переменной, и это должно решить проблему для вас. Вам не нужен символ @, когда вы находитесь в блоках @{} (вы можете напрямую обращаться к Request), и, по-видимому, это фактически приводит к несоответствию фигурных скобок. Я предполагаю, что @ заставляет синтаксический анализатор Razor запутаться и выйти из блока кода раньше. Другие нарушения синтаксиса также вызовут это, поэтому сообщение Дая, вероятно, тоже применимо.

// If validation is OK    
if (IsPost && Validation.IsValid())
{
    driverfirstname = Request.Form["driverfirstname"];
    driverlastname = Request.Form["driverlastname"];
    driverssn = Request.Form["driverssn"];

У вас также есть еще несколько применений синтаксиса @variable, которые, вероятно, необходимо разрешить:

var drivercodempp = dbs.Query("SELECT mpp_id FROM profile WHERE mpp_id = @drivercodetest");

а также

var insertCommand = "INSERT INTO driver (drivercode, driverfirstname, driverlastname, driverssn) VALUES(@0, @1, @2, @3)";

Это последнее, что вам может понадобиться для кодирования @ с помощью @@, так как вам действительно нужен литерал @. Если я не уловил всех нарушений синтаксиса, тогда начните вырезать большие части кода и вставлять их обратно построчно, пока не найдете то, что сбивает с толку парсер Razor.

Второстепенная проблема заключается в том, что большая часть этой логики, вероятно, должна быть перемещена из вашего представления в ваш контроллер или репозиторий, чтобы лучше следовать шаблону разделения задач MVC. Но я думаю, что основной причиной здесь являются проблемы с синтаксисом, из-за которых вы преждевременно выходите из блока кода Razor.

person Sean B    schedule 30.10.2013