目前我的代码,还不算太花哨。
每行都必须有会议ID值。如果会议对象中没有会议ID,则返回错误并停止所有进程(列表中每行的会议ID都相同)。
议程项目是必要的,而且不能是重复的值。如果遗漏或重复,则会传回错误。
如果缺少Legistar ID,则议程项目的值将分配给缺少的Legistar ID。
议程项目和/或Legistar ID都不能包含重复值这些属性每个值都必须唯一否则,将停止,并返回错误
我尝试传递并验证的列表如下所示:
AgendaItem LegistarID Title
1 74490 Public Comment. (October 31 2022)
2 74491 Welcome Affirmative Action Commission Appointment. <-- Agenda Item 2
2 73403 Nomination Open Update. <-- Agenda Item 2
4 74490 Communication Strategy Update. <-- Legistar Id same as row 1
如何传递指定此类特定情况的消息,以便客户端应用程序接收并提醒用户?
这是我的ImportData例程的当前版本,这里没有任何内容
public ActionResult ImportData(List<MeetingAgendaXref_WIP> meeting) // see comment above procedure name
{
bool status = false;
string message = "";
try
{
if (ModelState.IsValid)
{
var errors = new List<string>();
var rowCounter = 1;
using (ClerkEntities db = new ClerkEntities())
{
foreach (var i in meeting)
{
if (i.MeetingID == 0)
{
message = string.Format("No Meeting ID. Please make sure that the Cross Reference meets the required criteria for each row before clicking the ""Upload"" button.");
// log error to list
errors.Add($"Row {rowCounter}: No Meeting ID. Please make sure that the Cross Reference meets the required criteria for each row before clicking the ""Upload"" button.");
return new JsonResult { Data = new { status = status, message = message } };
}
if (i.AgendaItem == 0)
{
message = string.Format("No Agenda Item. Please make sure that the Cross Reference file meets the required criteria for each row before clicking the ""Upload"" button.");
// log error to list
errors.Add($"{rowCounter}:No Agenda Item. Please make sure that the Cross Reference file meets the required criteria for each row before clicking the ""Upload"" button.");
return new JsonResult { Data = new { status = status, message = message } };
}
// if Legistar ID,
if (i.LegistarID == 0)
{
// and Agenda Item are not present, return error message, log error message
if (i.AgendaItem == 0)
{
message = string.Format("Agenda Item, and Legistar Id are missing. Please make sure that the Cross Reference file meets the required criteria for each row before clicking the ""Upload"" button.");
// log error to list
errors.Add("Agenda Item, and Legistar Id are missing. Please make sure that the Cross Reference file meets the required criteria for each row before clicking the ""Upload"" button.");
return new JsonResult { Data = new { status = status, message = message } };
}
// otherwise, if legistar id, is empty, but agenda item is not, then assign Agenda Item to Legistar Id.
else
{
i.LegistarID = i.AgendaItem;
}
}
var compositeKey = db.MeetingAgendaXref_WIP.Find(i.MeetingID, i.AgendaItem);
if (compositeKey == null)
{
// Add new
db.MeetingAgendaXref_WIP.Add(i);
}
else
{
// Update previously saved values (same or new)
db.Entry(compositeKey).CurrentValues.SetValues(i);
db.Entry(compositeKey).State = EntityState.Modified;
}
rowCounter++;
}
// If there are errors do not save and return error message
if (errors.Count > 0)
{
return new JsonResult { Data = new { status = status, message = string.Join("\n", errors) } };
}
else
{
db.SaveChanges();
message = string.Format(@"Your Cross Reference file has been uploaded successfuly!");
status = true;
return new JsonResult { Data = new { status = status, message = message } };
}
}
}
else
{
message = string.Format(@"Please make sure that the Cross Reference file meets the required criteria for each row before clicking the ""Upload"" button.");
return new JsonResult {Data = new {status = status, message = message}};
}
}
catch (System.ArgumentException ex)
{
status = false;
ExceptionLogging.WriteLogError(ex.ToString());
}
return new JsonResult {Data = new {status = status, message = message}};
}
3条答案
按热度按时间jgwigjjp1#
所以基本上,我们需要对这些字段进行3次验证(
MeetingID
,AgendaItem
,LegistarID
)。因为我不知道asp.net
的语法。我在这里用纯JavaScript格式演示这个解决方案,只是为了给予你知道它是如何工作的。你可以根据具体的语言来做相应的工作。我只是将上面的表数据转换为一个对象数组,其中每个对象将定义一行数据。
实时演示(所有描述性注解都已添加到以下代码片段中):
qnzebej02#
“检查数组是否包含具有某些()的重复项
要检查数组是否包含重复项:
1.使用Array.some()方法迭代数组。
1.检查当前值第一次出现的索引是否不等于其最后一次出现的索引。
1.如果满足条件,则数组包含重复项。”
https://bobbyhadz.com/blog/javascript-check-if-array-contains-duplicates#check-if-an-array-contains-duplicates-with-some
hrysbysz3#
对我来说,依靠客户端发送有效数据听起来很可怕,因为你可能无法阻止数据从任意来源到达。因此,每个后端都应该验证传入的数据,如果它没有隐藏在与其客户端的专用网络中。
您可以使用LINQ的
GroupBy
检查属性中是否有非唯一的条目,如下所示:对于每个非唯一值,
GroupBy
将给予如下结构:其中
Key
是不唯一的AgendaItem
,并且Grouping
包含具有相应的AgendaItem
值的所有记录。现在,您可以创建一条消息,列出所有非唯一的
AgendaItem
,如下所示:您可能仍然需要处理这样一个事实,即用于替换
LegistarId
值“0”的AgendaItem
可能已经存在于非零LegistarId
中,但这可以通过在双精度检查之前替换这些值来轻松实现。代码注解:内部
if
in已过时,因为它已在前面的
if
语句中被选中,并且永远不会为真。