MVC5 ViewModelvalidation远程

我试图在validation视图模型的同一阶段validation用户名,其余的validation工作正常,但我正在尝试使用以下代码片段来检查用户名是否已被使用:

// Cut down code to keep it simple. public class UserAccountRegistration { [Remote("CheckUsername", "Validation", ErrorMessage = "Username already exists.")] public string Username { get; set; } } 

我在Controllers目录中有一个名为“ValidationController.cs”的控制器,该控制器包含以下内容:

 using System; using System.Web.Mvc; using Test.Helpers; using System.Data.SqlClient; using System.Data; namespace Test.Controllers { public class ValidationController : Controller { // GET: Validation public ActionResult Index() { return View(); } [HttpGet] public JsonResult CheckUsername(string Username) { Encryption hlpEncryption = new Encryption(); DataConnections hlpDBConn = new DataConnections(); bool bUsernameAlreadyExists = false; string sEncUsername = hlpEncryption.Encrypt(p_sUsername); SqlConnection conn = hlpDBConn.DBConnection(); using (SqlCommand cmd = new SqlCommand("CheckIfUsernameExists", conn) { CommandType = CommandType.StoredProcedure }) { cmd.Parameters.AddWithValue("@Username", sEncUsername); conn.Open(); bUsernameAlreadyExists = (Convert.ToInt16(cmd.ExecuteScalar()) > 0); conn.Close(); } return Json(bUsernameAlreadyExists, JsonRequestBehavior.AllowGet); } } 

}

然而, CheckUsername方法甚至没有被击中,我做错了什么?

谢谢。

让我们仔细检查一下:

您已在布局(最好)中按顺序正确引用了以下库:

     

在您的Web配置文件中,您有:

      

在你看来像:

  @Html.LabelFor(m => m.Username) @Html.TextBoxFor(m => m.Username) @Html.ValidationMessageFor(m => m.Username) 

更重要的是,在您第一次单击提交之前,删除validation不会触发。 您需要使用提交按钮在

中包含以前的文本,以便能够validation用户名。 它不会自动为Regex,Required或StringLength。 我认为这样可以避免请求服务器,直到用户确定是他想要的用户名。

模型上的属性名称和CheckUsername函数的参数必须相等。 我认为他们不区分大小写。 试试:

  public JsonResult CheckUsername(string Username) { //change p_sUsername for Username //... } 

必须在视图中引用jquery,jquery.validate和jquery.validate.unobtrusive脚本,并且视图中用户名字段的html name属性必须与CheckUsername方法的输入匹配,因此这将起作用。

  

但这可能会导致模型绑定问题,因为您的属性是public string Username { get; set; } public string Username { get; set; } 所以最好的做法是让所有这些都保持不变。