Проверка ASP.NET MVC ajax на стороне сервера без использования модели - PullRequest
3 голосов
/ 03 апреля 2012

Я использую веб-сервисы и доступ к ним осуществляется из класса BaseController Я хотел бы запустить проверку сервера, чтобы проверить, является ли логин действительным. Таким образом, я могу отправить предупреждение с сообщением, если оно недействительно. Оповещение клиент должен. Я новичок в MVC, но знаю некоторые основы.

Я понимаю безопасность того, что я прошу. Логин - самый простой пример, который я мог придумать.

Другой пример.

Скажи, у меня есть контактная форма. Я хочу сделать проверку сервера без обновления страницы. Я понял, что могу опубликовать форму с AJAX. Мне нужно вернуть список ошибок и отобразить их на странице. Проверка будет выполнена в методе веб-службы, вызываемом из контроллера.

Ответы [ 5 ]

1 голос
/ 03 апреля 2012

Если вы действительно хотите передать свое имя пользователя и пароль на контроллер сервера и получить результат в клиентском скрипте, вы можете сделать это

В вашем контроллере аккаунта есть метод действия для проверки вашей комбинации имени пользователя и пароля. Вы вернете Json из метода действия на основе проверки, которую вы выполняете в своем методе. Мы объявляем класс с именем "JsonDataResult", который вы можете использовать для связи с jSon. Этот класс имеет два строковых свойства properties.a "Message", куда вы можете отправить сообщение ("Success" / "Errors") и список строк для хранения сообщений об ошибках, если таковые имеются.

public class JsonDataResult
{
   public string Message { get;set;}
   public List<String> Items = new List<String>();
}

и вот мой метод действия выглядит как

  public ActionResult Logon(string userName,string password)
  {
       // check your username password and if there is its not valid, do this
        List<String> errors = new List<String>();
        errors.Add("username is not available");
        errors.Add("password is not nice!");

        var data = new JsonDataResult { Message = "Errors", Items = errors };
        return Json(data);
  }

Вы можете установить значение сообщения как «Успех», если имя пользователя и пароль верны. Вы также можете пропустить добавление сообщений об ошибках.

Теперь из вашего клиентского скрипта используйте публикацию jQuery для публикации данных в метод действия, получения результата jSon и проверки значения свойств сообщения. Если написано «Ошибки», выполните цикл через каждую ошибку и покажите его.

$(function () {
    $("form").submit(function () {
        $.post('@Url.Action("Logon","Account")', { userName: $("#username").val(), password: $("#password").val() }, function (data) {

            if (data.Message == "Errors") {
                $.each(data.Items, function (index) {
                    alert(data.Items[index]);
                });
            }
            else
            {
                // validation is successful.May be you want to redirect now ?
            }
        });
        return false;
    });
});
1 голос
/ 03 апреля 2012

Если вы используете членство провайдера и вам нужно подтвердить пользователя, может быть использовано следующее.

 bool isValidLogin = Membership.ValidateUser(UserName, Password);

ИЛИ попробуйте получить помощь после

 bool isValidLogin = FormsAuthentication.Authenticate(UserName, Password);
1 голос
/ 03 апреля 2012

Просто попросите ваш веб-сайт вызвать AJAX POST с учетными данными и вызвать это:

FormsAuthentication.SetAuthCookie(userEmail or whatever, true);

Затем верните результат JSON (не View) и проверьте результат в своем коде jQuery на сайте.

0 голосов
/ 03 апреля 2012

В какой-то момент мне пришлось написать некоторую пользовательскую логику проверки для большого количества динамического контента, который имел слабо соответствующие модели, но в зависимости от выбранных опций проверка была другой.Я просто скопирую и вставлю код из моего приложения в тупик, но вы можете следовать базовому примеру.Это также для сохранения нескольких форм на нескольких вкладках ... но работает и для одной, но вы, вероятно, можете упростить это. JS старый и его тоже можно много почистить с помощью обещаний и распределенных событий, но это тема длядругой день.

JS:

$("button#Save").on("click", function () {
            // checks if existing errors have been cleared before trying to submit again
        if ($(".ui-state-error, .ui-state-error-text", "#tabs").length) {
            alert("There are errors on the page. You must correct any errors before saving.");
        }
        else {
                // don't allow to submit twice.. again.. better ways to do this..
            if (!Saving) {
                Saving = true;
                            // show saving message overlay
                $('#CanvasLoading').html("Saving...<span>Loading</span>").show();
                //map data
                            // PASSES IN THE ID OF THE FORM
                var data = $("form.create-item-form", "#tabs").map(function () {
                    var $form = $(this);

                    return {
                        Name: $form.find(":input[name=Name]").val(),
                        FolderName: $form.find(":input[name=FolderName]").val(),
                        ItemName: $form.find(":input[name=ItemName]").val(),
                        ViewId: $form.find(":input[name=ViewId]").val(),
                        FormId: $form.attr("id")
                }).toArray();

                $.ajax(
                {
                    url: Routes.New.SaveAllPost,
                    type: 'POST',
                    contentType: 'application/json',
                    data: { items: data },
                    success: function (resultJSON) {
                        var result = $.parseJSON(resultJSON);
                        if (result.Success) {
                                Saving = false;
                            });
                        }
                        else {
                            $.each(result.Errors, function (i, item) {
     // loops through all items and applies class ui-state-error to inputs in the form with given id
                                var formId = item.FormId;
                                var propertyName = item.FieldName;
                                $.each(item.Errors, function (i, error) {
                                    var id = $("input[name=" + propertyName + "], select[name=" + propertyName + "]", "#" + formId).addClass("ui-state-error").parents("div.ui-tabs-panel:first").attr("id");
                                    $("#li-upload-" + id, "#tabs").addClass("ui-state-error");
                                });
                            });

                               // hide loading overlay
                            $('#CanvasLoading').hide();
                            Saving = false;
                        }
                    }
                });
            }
            else {
                alert("You have already started saving. Please wait for results to process.");
            }
        }
        return false;
    });

C #:

public class NewController : Controller
    {
[HttpPost]
        public JsonResult SaveAll(List<UploadViewModelDTO> items)
        {
            UploadItemValidationDTO validation = ValidateItems(items);
            if (validation.Success)
            {   
                // validated: do stuff

            }

            return Json(validation);
        }
}

private UploadItemValidationDTO ValidateItems(List<UploadViewModelDTO> items)
        {
            UploadItemValidationDTO validation = new UploadItemValidationDTO();

            // check for errors
            // if error add using following code
            // error has field name and id of form it came from
            validation.Errors.Add
            (
                new Error
                {
                    Errors = new List<string>() { "Folder is required" },
                    FieldName = "FolderName",
                    FormId = item.FormId
                }
            );          

            validation.Success = (validation.Errors.Count < 1);

            return validation;
        }

public class UploadItemValidation
    {
        public UploadItemValidation()
        {
            Errors = new List<Error>();
        }

        public bool Success {get;set;}
        public List<Error> Errors {get;set;}
    }

    public class Error
    {
        public string FormId {get;set;}
        public string FieldName {get;set;}
        public List<string> Errors {get;set;}
    }
0 голосов
/ 03 апреля 2012

Примерно так, хотя передача пароля через ajax-запрос, вероятно, не очень хорошая идея.

Ваш вопрос сбивает с толку, так что вот основная идея ..

CS:

public AuthController
{
        [HttpPost]
        public JsonResult CheckAuthentication(string UserName, string Password)
        {
            return Json(Membership.ValidateUser(UserName, Password));
        }
}

JS:

var authChecking = $.post("/Auth/CheckAuthentication", { UserName: username, Password: password });
authChecking.done(function(result) { if (!result) 
    {
        alert("Invalid");
        // or dialog or whatever.
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...