Проблема при попытке отправить форму как не авторизованный пользователь - PullRequest
0 голосов
/ 09 марта 2019

Извините за название, но я не знал, как объяснить это всего одним предложением.У меня есть представление с формой:

@using (Html.BeginForm("AddComment", "Restaurants"))
{
    @Html.TextBoxFor(c => c.NewComment.Body)
    @Html.HiddenFor(m => m.Restaurant.Id)
    <button type="submit">Add comment</button>
}

И действие AddComment в контроллере Restaurants:

public ActionResult AddComment(RestaurantViewModel model, Comment newComment)
{
    var userId = User.Identity.GetUserId();
    var user = _context.Users.FirstOrDefault(u => u.Id == userId);

    newComment.RestaurantId = model.Restaurant.Id;
    newComment.AuthorId = Guid.Parse(userId);
    newComment.AuthorName = user.UserName;
    newComment.DateTime = DateTime.Now;

    _context.Comments.Add(newComment);
    _context.SaveChanges();

    return RedirectToAction("Details", "Restaurants", new { id = model.Restaurant.Id});
}

И я добавил фильтр авторизации:

filters.Add(new AuthorizeAttribute());

Когда я пытаюсьчтобы отправить форму как незарегистрированный пользователь, он перенаправляет меня на страницу входа.Если я захожу на эту страницу, он вызывает AddComment Action, но передает аргументы Model.Restaurant и NewComment.Body как нули.Как это исправить, чтобы при входе в систему он перенаправлял меня на предыдущую страницу с заполненным TextBox или просто вызывал AddComment, но передавал правильные значения аргументов.

Ответы [ 3 ]

1 голос
/ 09 марта 2019

Нет встроенного способа сделать это. Причина в том, что это не «способ делать вещи». Если у вас есть форма с защищенным действием POST, сделайте соответствующую страницу GET только для аутентификации.

0 голосов
/ 11 марта 2019

Я не предлагаю делать это вне простейших случаев. Вы можете изменить форму, чтобы использовать get вместо post:

@using (Html.BeginForm("AddComment", "Restaurants", FormMethod.Get))
{
    @Html.TextBoxFor(c => c.NewComment.Body)
    @Html.HiddenFor(m => m.Restaurant.Id)
    <button type="submit">Add comment</button>
}

Предостережения:

  • Это будет работать, только если вы используете встроенную аутентификацию или ваша реализация перенаправляет значения строки запроса.
  • Во-вторых, значения будут в URL, поэтому они могут быть легко изменены.
  • И последнее, но не менее важное: если AddComment имеет атрибут HttpPost, вам придется удалить его.
0 голосов
/ 09 марта 2019

Попробуйте удалить эту строку:

filters.Add(new AuthorizeAttribute());

И добавление обозначения [Authorize] к вашему методу, например:

[Authorize]
public ActionResult AddComment(RestaurantViewModel model, Comment newComment)
{
    var userId = User.Identity.GetUserId();
    var user = _context.Users.FirstOrDefault(u => u.Id == userId);

    newComment.RestaurantId = model.Restaurant.Id;
    newComment.AuthorId = Guid.Parse(userId);
    newComment.AuthorName = user.UserName;
    newComment.DateTime = DateTime.Now;

    _context.Comments.Add(newComment);
    _context.SaveChanges();

    return RedirectToAction("Details", "Restaurants", new { id = model.Restaurant.Id});
}
...