如何验证拆分为几个 html 文本框的字符串模型 属性?
How to validate string model property splitted in a few html text boxes?
我在数据库中有一个 table,它有 1 个 GUID 列。它作为简单字符串映射到实体 属性:
[Required]
public string Code {get;set;}
我希望客户端将此 属性 视为 4 个文本框?他们每个人都包含一部分:
Code.Split(new[] {"-"}, StringSplitOptions.None)
如果孔值将显示在 1 html 文本框中,我知道如何通过 RegularExpressinAttribute
验证此 属性。但我希望它在向用户显示之前解析为 4 个部分,并在用户编辑这些文本框后组合在一起。那么,请问您能否帮助我如何在服务器和客户端上进行验证。谢谢!
您应该为您的视图创建一个具有四个独立属性的视图模型
public class CreateCodeVm
{
[Required]
public string CodePart1 { set;get;}
[Required]
public string CodePart2 { set;get;}
[Required]
public string CodePart3 { set;get;}
[Required]
public string CodePart4 { set;get;}
}
您将使用此视图模型在视图和操作方法之间传输数据。一旦您读取了您的操作方法中的值,您就可以使用它来保存到您的数据库中,您可以在其中使用您的 ORM 创建的实体 class。
当您必须向用户显示此内容时,请阅读 Guid 并将其转换为字符串然后拆分。
public ActionResult Edit(int id)
{
var vm = new CreateCodeVm();
var guidVariable = GetGuidFromYourDataBaseSomeHave();
var parts = guidVariable.ToString().Split('-');
vm.CodePart1 = parts[0];
vm.CodePart2 = parts[1];
vm.CodePart3 = parts[2];
vm.CodePart4 = parts[3];
return View(vm);
}
在你看来
@model CreateCodeVm
@using(Html.BeginForm())
{
@Html.TextBoxFor(s=>s.CodePart1)
@Html.ValidationMessageFor(s=>s.CodePart1)
@Html.TextBoxFor(s=>s.CodePart2)
@Html.ValidationMessageFor(s=>s.CodePart2)
@Html.TextBoxFor(s=>s.CodePart3)
@Html.ValidationMessageFor(s=>s.CodePart3)
@Html.TextBoxFor(s=>s.CodePart4)
@Html.ValidationMessageFor(s=>s.CodePart4)
<input type="submit" />
}
并且在您的 HttpPost 操作中,您可以检查验证错误
[HttpPost]
public ActionResult Edit(CreateCodeVm model)
{
if(ModelState.IsValid)
{
//save and return(redirect result) something
}
return View(model);
}
虽然这将解决您验证 4 个单独字符串的问题,但它可能会带来另一个问题。如果您的 2 个用户为所有四个部分输入相同的值怎么办?您将从中生成相同的 Guid ?如果您的数据库列是 uniqueidentifier 类型,它可能会给您带来问题。
我在数据库中有一个 table,它有 1 个 GUID 列。它作为简单字符串映射到实体 属性:
[Required]
public string Code {get;set;}
我希望客户端将此 属性 视为 4 个文本框?他们每个人都包含一部分:
Code.Split(new[] {"-"}, StringSplitOptions.None)
如果孔值将显示在 1 html 文本框中,我知道如何通过 RegularExpressinAttribute
验证此 属性。但我希望它在向用户显示之前解析为 4 个部分,并在用户编辑这些文本框后组合在一起。那么,请问您能否帮助我如何在服务器和客户端上进行验证。谢谢!
您应该为您的视图创建一个具有四个独立属性的视图模型
public class CreateCodeVm
{
[Required]
public string CodePart1 { set;get;}
[Required]
public string CodePart2 { set;get;}
[Required]
public string CodePart3 { set;get;}
[Required]
public string CodePart4 { set;get;}
}
您将使用此视图模型在视图和操作方法之间传输数据。一旦您读取了您的操作方法中的值,您就可以使用它来保存到您的数据库中,您可以在其中使用您的 ORM 创建的实体 class。
当您必须向用户显示此内容时,请阅读 Guid 并将其转换为字符串然后拆分。
public ActionResult Edit(int id)
{
var vm = new CreateCodeVm();
var guidVariable = GetGuidFromYourDataBaseSomeHave();
var parts = guidVariable.ToString().Split('-');
vm.CodePart1 = parts[0];
vm.CodePart2 = parts[1];
vm.CodePart3 = parts[2];
vm.CodePart4 = parts[3];
return View(vm);
}
在你看来
@model CreateCodeVm
@using(Html.BeginForm())
{
@Html.TextBoxFor(s=>s.CodePart1)
@Html.ValidationMessageFor(s=>s.CodePart1)
@Html.TextBoxFor(s=>s.CodePart2)
@Html.ValidationMessageFor(s=>s.CodePart2)
@Html.TextBoxFor(s=>s.CodePart3)
@Html.ValidationMessageFor(s=>s.CodePart3)
@Html.TextBoxFor(s=>s.CodePart4)
@Html.ValidationMessageFor(s=>s.CodePart4)
<input type="submit" />
}
并且在您的 HttpPost 操作中,您可以检查验证错误
[HttpPost]
public ActionResult Edit(CreateCodeVm model)
{
if(ModelState.IsValid)
{
//save and return(redirect result) something
}
return View(model);
}
虽然这将解决您验证 4 个单独字符串的问题,但它可能会带来另一个问题。如果您的 2 个用户为所有四个部分输入相同的值怎么办?您将从中生成相同的 Guid ?如果您的数据库列是 uniqueidentifier 类型,它可能会给您带来问题。