Как проверить, существует ли имя пользователя с помощью ajax в asp.net? - PullRequest
1 голос
/ 07 января 2012

Я работаю над приложением, в котором есть форма регистрации, и я должен показать пользователю, существует ли имя пользователя или нет. Я использую asp.net mvc3 и планировал использовать AJAX для достижения этой цели.

У меня есть форма

<tr>
<td>User Name*</td>
<td><input id="UserName" name="UserName" type="text" onblur="check(this.value);"/></td>
<td id= "UName"></td>
</tr>

, который вызывает файл .js с содержимым фолдинга

function check(User) {
    ...
    var url = "/UserNameCheck/Index";
    url += "?User=" + User;
    xmlHttp.onreadystatechange = state_Change;
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
}
function state_Change() {
    if (xmlhttp.readyState == 4) {// 4 = "Response loaded"

        if (xmlhttp.status == 200) {// 200 = Response Error Free               
            document.getElementById("UName").innerHTML = xmlHttp.responseText
        }
        else {
            alert("Problem retrieving XML data");
        }
    }
}

Я предупредил имя пользователя и получаю правильное введенное значение. Теперь URL-адрес - / UserNameCheck / Index, где UserNameCheck - это контроллер, а Index - это метод.

Контроллер имеет этот код.

public ActionResult Index(string User)
        {
            string UserName;
            try
            {
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                UserName = Request.QueryString["User"];
                ConnectionPackage.ConnectionClass cc = new ConnectionPackage.ConnectionClass();
                conn = cc.con;
                string sql = "Select UserName FROM UserDetails where UserName = '" + UserName + "'";
                conn.Open();
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.CommandType = CommandType.Text;
                object p = cmd.ExecuteScalar();
                cmd.ExecuteNonQuery();
                string u = (string)p;
                if (u.Length==0 || u.Equals("NULL") || u.Equals("null")||u.Equals("Null"))
                {
                    return View();
                }

                return null;
            }
            catch (Exception ex){
            }

и представление имеет

 String buffer = " <table><tr><td id = 'UName' >" This user name already exists. Please select some other unser name.
 buffer = buffer + "</td></tr></table>";
 response.getWriter().println(buffer);

Я тоже пытался написать

Response.Clear();
Response.Write("UserName already exists. Please select another UserName");
Response.End();

вместо возврата View. Но в обоих случаях я не получил никакого сообщения о том, что имя пользователя существует, хотя я набрал имя пользователя, которое уже присутствовало в базе данных.

Строка подключения работает для вставки в базу данных, поэтому я не думаю, что с этим есть проблема. Есть ли проблема с URL, который я упомянул в файле js? Или весь мой подход неверен? Я в основном из Java, поэтому не знаю много о asp.net. Пожалуйста, помогите.

Заранее большое спасибо.

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Я следовал тому, что было дано в статье MSDN Как выполнить удаленную проверку в ASP.NET MVC

jQuery в действии - самая популярная книга jQuery

1 голос
/ 07 января 2012

У тебя все хорошо, но ты мог бы сделать это намного проще для себя.Если вы используете MVC3 с Razor, в вашем приложении уже установлен jQuery.

  1. Используйте метод $.ajax() для выполнения вызовов вашего действия контроллера, которое проверяет имена ...

  2. Присвойте вызов $ .ajax () "ненавязчиво", что означает, что вместо элемента управления HTML привязывайте событие к вашему элементу управления из jquery / javascript.

  3. Во-вторых, если вам нужна небольшая производительность, вы можете связать ее с помощью функции live() jquery или события keyup, чтобы при вводе вызова выполнялся вызов ajax и вы находили в реальном времени.

В конечном итоге вы получите гораздо меньше JavaScript, и ваши JS-компоненты будут четко отделены от вашей разметки.

Что касается действия вашего контроллера, оно выглядит хорошодля игры и обучения, но вы можете подумать о том, чтобы (а) поместить ваш оператор SQL как хранимую процедуру на сервере db и вызвать его, или (б) написать класс шаблона репозитория, а затем использовать LINQ to выполнить ваш запрос после извлечения БД.

Другой возможностью будет использование Entity Framework 4.1 через NuGet для устранения обеих потребностей.Это может иметь некоторую кривую обучения, но есть много хороших вещей, и ваш пример будет довольно простым для начала.

Дайте мне знать, если у вас есть какие-то конкретные проблемы с вашим кодом, и ямогу дать более подробный ответ.

...