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不会触发。 您需要使用提交按钮在
模型上的属性名称和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; }
所以最好的做法是让所有这些都保持不变。