如何验证在几个html文本框中拆分的字符串模型属性?

时间:2016-02-21 18:59:15

标签: c# validation asp.net-mvc-4 unobtrusive-validation

我在数据库中有一个表,其中有一个GUID列。它作为简单的字符串属性映射到实体:

.idea/

我希望客户端将此属性视为4个文本框?它们中的每一个都包含以下部分:

[Required]
public string Code {get;set;}

如果在1 html文本框中显示孔值,我知道如何通过Code.Split(new[] {"-"}, StringSplitOptions.None) 验证此属性。但我希望它在显示给用户之前解析为4个部分,并在用户编辑这些文本框后组合在一起。那么请你帮助我如何在服务器和客户端上进行验证。谢谢!

1 个答案:

答案 0 :(得分:0)

您应该为视图创建一个具有四个单独属性的视图模型

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;}
}

您将使用此视图模型在视图和操作方法之间传输数据。一旦读取了action方法中的值,就可以使用它来保存到db中,在那里可以使用ORM创建的Entity类。

当您必须向用户显示此内容时,请阅读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吗?如果db列的类型为uniqueidentifier,则可能会导致问题。