【发布时间】:2023-03-25 05:32:01
【问题描述】:
我正在使用 Visual Studio,制作一个 .CSHTML 网页。 该代码是工作代码。通过一些未知的编辑?还是错误?(不太可能) Visual Studio 将无法识别最后一组 {}。 开头的那些 @{这里是C#代码
}
编译器错误: “解析器错误消息:代码块缺少结束“}”字符。确保此块中的所有“{”字符都有匹配的“}”字符,并且没有任何“}”字符被解释作为标记。
来源错误:
第 2 行:
第 3 行:
第 4 行:@{
第 5 行: var db = Database.Open("DevDbCS");
第 6 行:
"
我已将我的代码复制并粘贴到记事本 ++ 中,如果我选择一个,则会突出显示相应的括号。我已确认所有制动器都正确打开和关闭。我什至把它放到了处理中,(不会编译)但它也说得很好。
@{
var db = Database.Open("DevDbCS");
var selectThorneID = "SELECT ThorneID, Status FROM Batch_Record WHERE Status = 'ACTIVE' ORDER BY ThorneID ASC";
//Variables
var ThorneID = " ";
var frmInsertV = "";
var frmInsert = "";
var frmUpdate = "";
var StartUnits = "";
var EndUnits = "";
var yield = "";
var formValues = new double[29];//array for holding results from Query
var QC = "";
int RecordCount = 0;
var sqlfrmValues = (db.Query("SELECT * FROM YieldEncap WHERE ThorneID = '" + ThorneID + "'")).Cast<DynamicRecord>().ToArray();
if (IsPost)
{
switch (Request.Form["userInput"])
{
case "Submit":
ThorneID = Request.Form["ThorneID"];
StartUnits = Request.Form["s12"];
EndUnits = Request.Form["s15"];
yield = Request.Form["s17"];
QC = Request.Form["QC"];
//Set to zero to avoid trying to put nulls in DB
if (Request.Form["s12"] == null)
{
StartUnits = "0";
}
else
{
StartUnits = Request.Form["s12"];
}
if (Request.Form["s15"] == null)
{
EndUnits = "0";
}
else
{
EndUnits = Request.Form["s15"];
}
if (Request.Form["s17"] == null)
{
yield = "0";
}
else {
yield = Request.Form["s17"];
}
for (int i = 1; i <= 26; i++)
{
//set to 1 to keep NaN from appearing, cant divide by zero
var itemStr = "var" + i.ToString();
var rfTemp = "";
if (Request.Form[itemStr] == null)
{
rfTemp = "0";
if (i == 3)
{
rfTemp = "1";
}
if (i == 10)
{
rfTemp = "1";
}
if (i == 16)
{
rfTemp = "1";
}
}
else
{
rfTemp = Request.Form[itemStr];
}
//put commas after 1st variable in the string for SQL
if (i != 1)
{
frmUpdate += ", ";
frmInsert += ", ";
frmInsertV += ", ";
}
frmUpdate += "s" + i + "= " + rfTemp;
frmInsertV += "s" + i;
frmInsert += rfTemp;
}
var UPSERTcommand = "IF EXISTS (SELECT * FROM YieldEncap WHERE ThorneID = '" + ThorneID + "') "
+ "UPDATE YieldEncap SET " + frmUpdate + ", QC='" + QC + "' "
+ "WHERE ThorneID = '" + ThorneID + "' "
+ "ELSE "
+ "INSERT INTO YieldEncap (ThorneID, QC, " + frmInsertV + ") "
+ "VALUES (" + ThorneID + ", '" + QC + "', " + frmInsert + ")";
db.Execute(UPSERTcommand);
UPSERTcommand = "IF EXISTS (SELECT * FROM BR_Details_Yield WHERE ThorneID = '" + ThorneID + "') "
+ "UPDATE BR_Details_Yield SET Department = 'Encap', Units = 'g', StartUnits = '" + StartUnits + "', EndUnits = '" + EndUnits + "', Yield = '" + yield + "' "
+ "WHERE ThorneID = '" + ThorneID + "' "
+ "ELSE "
+ "INSERT INTO BR_Details_Yield (Department, Units, StartUnits, EndUnits, Yield) "
+ "VALUES ('Encap', 'Bottles', " + StartUnits + ", " + EndUnits + ", " + yield + ")";
db.Execute(UPSERTcommand);
UPSERTcommand = "";
sqlfrmValues = (db.Query("SELECT * FROM YieldEncap WHERE ThorneID = '" + ThorneID + "'")).Cast<DynamicRecord>().ToArray();
RecordCount = (int)db.QueryValue("SELECT COUNT(*) FROM YieldEncap WHERE ThorneID = '" + ThorneID + "'");
//read out the values from sqlfrmValues and place them in an array
if (RecordCount > 0)
{
for (int i = 1; i <= 26; i++)
{
if (sqlfrmValues[0][i] != null)
{
formValues[i] = Convert.ToDouble(sqlfrmValues[0][i]);
}
else
{
formValues[i] = 0;
}
}
QC = Convert.ToString(sqlfrmValues[0][27]);
}
else
{
formValues[2] = 1;
formValues[10] = 1;
formValues[16] = 1;
formValues[19] = 1;
}
break;
default:
ThorneID = Request.Form["ThorneID"];
sqlfrmValues = (db.Query("SELECT * FROM YieldEncap WHERE ThorneID = '" + ThorneID + "'")).Cast<DynamicRecord>().ToArray();
var RecordCount2 = (db.Query("SELECT COUNT(*) FROM YieldEncap WHERE ThorneID = '" + ThorneID + "'").Cast<DynamicRecord>().ToArray();
if (RecordCount[0][0] > 0)
{
for (int i = 1; i <= 26; i++)
{
if (sqlfrmValues[0][i] != null)
{
formValues[i] = Convert.ToDouble(sqlfrmValues[0][i]);
}
else
{
formValues[i] = 0;
}
}
QC = Convert.ToString(sqlfrmValues[0][27]);
}
else
{
formValues[6] = 1;
formValues[8] = 1;
formValues[11] = 1;
formValues[24] = 1;
}
//lookup for previous worksheet. Starting point value
//var sqlMixing = (db.Query("SELECT * FROM YieldMixing WHERE ThorneID = '" + ThorneID + "'")).Cast<DynamicRecord>().ToArray();
//var sqlMixingRecordCount = (int)db.QueryValue("SELECT COUNT(*) FROM YieldMixing WHERE ThorneID = '" + ThorneID + "'");
//if (sqlMixingRecordCount > 0)
//{
// var temp = Convert.ToDouble(sqlfrmValues[0][1]);
// formValues[1] = Convert.ToDouble(sqlMixing[0][1]);
//}
var sqlMixing = (db.Query("SELECT * FROM YieldMixing WHERE ThorneID = '" + ThorneID + "'")).Cast<DynamicRecord>().ToArray();
RecordCount = (int)db.QueryValue("SELECT COUNT(*) FROM YieldMixing WHERE ThorneID = '" + ThorneID + "'");
if (RecordCount > 0)
{
formValues[24] = Convert.ToDouble(sqlMixing[0][2]);
formValues[24] = formValues[24] * 1000;
}
break;
}
}
}
当它到达我的 !DOCTYPE html 时,它告诉我“无法找到类型或命名空间名称‘DOCTYPE’......) 可能是因为它无法确定右括号在哪里。
我哪里做错了?令人沮丧的是编译器消息没有帮助,因为所有大括号都是正确的!
【问题讨论】:
-
可能是这个块外的大括号在干扰?
-
请使用参数化 SQL 语句而不是字符串连接。您的应用程序面临 SQL 注入漏洞。
-
在 Razor 视图中编写复杂的代码通常会导致这些问题,因为编译器试图处理标记和代码块,有人会感到困惑。简而言之,不要这样做。将代码拉入控制器或后面的代码(或者更好的是由 UI 调用的其他类),因此编译器只需处理代码。
-
我记得看到一位 Razor 的 MS 开发人员基本上说解析 Razor 非常复杂。我遇到了一些奇怪的问题,只能通过大惊小怪的结构来解决,直到我找到不会让编译器感到不安的东西。我绝对会非常同意 dbugger。您绝对在 Razor 页面上放置了错误类型的代码!我什至不会称这是意见/风格的差异。它从来没有真正打算容纳您的数据库和业务逻辑。这就是控制器的用途,甚至瘦控制器方法也将其转移到业务+数据库层。
-
@DanielMann “请使用参数化 SQL 语句,而不是字符串连接。您的应用程序面临 SQL 注入漏洞。”当表单变量被存储到一个双精度数组中,然后被服务器从数组中转储到一个字符串中时,我如何打开 SQL?
标签: c# visual-studio visual-studio-2012 razor