【问题标题】:Checking if input is GUID or not检查输入是否为 GUID
【发布时间】:2021-09-29 11:57:46
【问题描述】:

我正在做这个小项目,我要做的是检查用户输入是否为 GUID。

我已经在 SQL 上创建了这个存储过程,它工作得很好。

ALTER procedure [dbo].[oid_validation] @oid varchar(max)
as
BEGIN TRY

if  (TRY_CAST(@oid as uniqueidentifier) IS NOT NULL)
begin
 (select select * From Student where oid=@oid)
end
else begin
select 'KO'
end 

end TRY
Begin CATCH
print('error')
end CATCH

另一方面,在我的 ASP.NET MVC 应用程序中,我想根据输入是否为 GUID 来显示此过程返回的数据。 所以我的观点是:

 @foreach (DataRow row in Model.Rows)
            {
              
                    <div class="ct1">
                        <h4>Oid: </h4>
                        <h4>Name: </h4>
                        <h4>Lastname: </h4>
                        <h4>Study_Year: </h4>
                        <h4>Birthday: </h4>
                        <h4>City:</h4>
                    </div>
                    <div class="ct2">
                        <h4>@row["oid"]</h4>
                        <h4>@row["Name"]</h4>
                        <h4>@row["Lastname"]</h4>
                        <h4>@row["StudyYear"]</h4>
                        <h4>@row["Birthday"]</h4>
                        <h4>@row["City"]</h4>
                    </div>
                }

这也很好用。这样,用户将再次看到他们想要的数据,*基于该输入是否为 guid。 现在我想做的是操作一些东西,所以如果用户输入无效的输入,显示一些文本或重定向到其他地方;

类似这样的:

if(userinput!=guid)
{
<h4>Your data is invalid, please check your string!</h4>
}
else
{
//foreach(...)
{
<data1>

@<data1>
}
}

【问题讨论】:

  • 您的问题究竟是什么?你被什么困住了?
  • 嗨,我坚持认为 if(userinput is not Guid) { show something} else { read the data}。
  • 您需要帮助的部分似乎没有涉及 SQL Server?
  • 如果@oid 意味着包含uniqueidentifier,为什么将其定义为20 亿个字符串?

标签: sql asp.net sql-server asp.net-mvc model-view-controller


【解决方案1】:

您总是可以使用 Regex 来检查输入:

//returns true
Regex.IsMatch(Guid.NewGuid().ToString(), @"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$") 

或使用建议的内置函数:

Guid g;

if (Guid.TryParse(Guid.NewGuid().ToString(), out g))
{
    return "Success";
}

【讨论】:

【解决方案2】:

我认为您在错误的级别上进行了输入验证。您的存储过程应该采用唯一标识符,并且您应该在对 ASP.NET MVC 端点执行任何操作之前验证输入。

例如

ActionResult SearchStudents(SearchParams searchParams) {
     if (!ModelState.IsValid) ... handle validation errors

     ... Call your stored procedure once valid
}

class SearchParams {
    [Required]
    Guid StudentId { get; set;}
}

【讨论】:

  • 有道理,但它会向我的视图返回一个错误,说:列'oid'不属于表
  • 这表明您的学生表没有 oid 列。您应该尝试直接运行存储过程。
  • 是的,你是对的。但是 sproc 有 oid 作为参数,这就是事情有点混乱的地方,因为我必须根据他的输入向用户显示一些数据,这与 sproc 的参数有关。如果用户输入/参数正确,则执行 sproc 并且用户将获取他们的数据,如果不正确...**空白**。海拉很乱,对吧?哈哈。但是多亏了你们,我才让它工作。感谢您的宝贵时间和帮助。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2018-04-14
相关资源
最近更新 更多