Передача имени пользователя обратно в MVC view / textbox после неудачного входа в систему - PullRequest
0 голосов
/ 15 января 2019

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

public class User
{
   public bool RememberMe { get; set; }
   public string Username { get; set; }
}

Эта информация передается в метод контроллера через

login( User user )
{
    … validate user
    if (!valid)
    {
        ModelState.AddModelError("", "Login name or password is incorrect!");
        return View(user);  
    }
}

Я подтвердил, что имя пользователя существует в объекте пользователя, возвращаемом в представление.

Теперь в представлении у меня есть это:

@model Myapp.Models.User

<label class="form-label" for="form-signin-username">Username</label>
<input data-bind="value: loginViewModel.Username" class="form-control" id="form-signin-username" name="username" type="text" required="" placeholder="Username">

JavaScript такой:

var LoginViewModel = function () {
    self.UserName = ko.observable();
    self.Password = ko.observable();
    self.Authenticate = function (event) {
        var data = {
            UserName: self.UserName(),
            Password: self.Password()
        }
        xhr = $.ajax({
            data: data,
            dataType: 'JSON',
            type: "POST",
            url: "/Home/Login",
            success: function (data) {
            if (data.Success) {
            // process successful login ( this works)
            }
            else
            {
                // this is what doesn't work
                self.UserName = data.Username;  
            }
        }
    }
}

Кто-нибудь может понять, почему это текстовое поле не заполняется автоматически с помощью предыдущего имени пользователя?

1 Ответ

0 голосов
/ 15 января 2019

Необходимо убедиться, что требуемые значения модели назначены для модели вида

Например

var LoginViewModel = function () {
    self.UserName = ko.observable(@(Model.Username)); //set initial value
    //...

Я бы также предложил использовать HtmlHelper для входов в представлении

@model Myapp.Models.User

<!--...-->

@Html.LabelFor(m => m.Username, "Username")
@Html.TextBoxFor(m => m.Username, new { data_bind = "value: Username", @class = "form-control", placeholder="Username"})
...