簡體   English   中英

MVC5 ViewModel驗證遠程

[英]MVC5 ViewModel Validation Remote

我試圖在驗證視圖模型的同一階段驗證用戶名,其余的驗證工作正常,但我正在嘗試使用以下代碼片段來檢查用戶名是否已被使用:

// 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方法甚至沒有被擊中,我做錯了什么?

謝謝。

模型上的屬性名稱和CheckUsername函數的參數必須相等。 我認為它們不區分大小寫。 試試:

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

讓我們仔細檢查一下:

您已在布局(最好)中按順序正確引用了以下庫:

    <script src="~/Scripts/jquery-2.2.3.min.js"></script>    
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

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

  <appSettings>    
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

在你看來像:

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

更重要的是,在您第一次單擊提交之前,刪除驗證不會觸發。 您需要使用提交按鈕在<form>中包含以前的文本,以便能夠驗證用戶名。 它不會自動為Regex,Required或StringLength。 我認為這樣可以避免請求服務器,直到用戶確定是他想要的用戶名。

必須在視圖中引用jquery,jquery.validate和jquery.validate.unobtrusive腳本,並且視圖中用戶名字段的html name屬性必須與CheckUsername方法的輸入匹配,因此這將起作用。

<input type="text" name="p_sUsername" />

但這可能會導致模型綁定問題,因為您的屬性是public string Username { get; set; } public string Username { get; set; } public string Username { get; set; } ,所以最好的做法是,讓所有的人都一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM