Razor — для публикации параметров URL и данных формы

#c# #.net #razor

#c# #.net #бритва

Вопрос:

Я настроил страницу razor со следующим маршрутом — я не могу понять, как {email} и {token} отправляются на мой OnPost.

Он всегда возвращается как недопустимый ModelState, и я не уверен, как это исправить.. — есть идеи, пожалуйста? уверен, что это что-то простое, чего мне здесь не хватает..

@page "/ResetPassword/{email}/{token}

У меня есть форма, созданная как таковая:

     <form method="post" asp-page-handler="OnPost">
        @Html.AntiForgeryToken()

        <input type="hidden" name="Token" value="@ViewContext.RouteData.Values["token"]" />
        <input type="hidden" name="Email" value="@ViewContext.RouteData.Values["email"]" />
       


        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="VModel.Password" class="control-label"></label>
            <input asp-for="VModel.Password" class="form-control" />
            <span asp-validation-for="VModel.Password" class="text-danger"></span>
        </div>


        <div class="form-group">
            <label asp-for="VModel.ConfirmPassword" class="control-label"></label>
            <input asp-for="VModel.ConfirmPassword" class="form-control" />
            <span asp-validation-for="VModel.ConfirmPassword" class="text-danger"></span>
        </div>


        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>

    </form>

 

В исходном коде у меня есть:

   [BindProperty]
        public ResetPasswordViewModel VModel { get; set; }


  public async Task<IActionResult> OnPost()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            var result = await _userService.ResetPasswordAsync(VModel);


            if (result.IsSuccess)
            {
                return RedirectToPage("Success");
            }
            else
            {
                Errors = (List<string>)result.Errors;
                return Page();
            }

        }

 

ResetPasswordViewModel:

 
    public class ResetPasswordViewModel
    {
        [Required]
        public string Token { get; set; }

        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [StringLength(50, MinimumLength =5)]
        [DataType(DataType.Password)]
        public string Password { get; set; }


        [Required]
        [Display(Name = "Confirm Password")]
        [DataType(DataType.Password)]
        [StringLength(50, MinimumLength = 5)]
        public string ConfirmPassword { get; set; }
    }


 

Ответ №1:

Поместите VModel перед вашим свойством…

   <input type="hidden" name="VModel.Token" value="@ViewContext.RouteData.Values["token"]" />
  <input type="hidden" name="VModel.Email" value="@ViewContext.RouteData.Values["email"]" />
   
 

Комментарии:

1. Спасибо за быстрый ответ!!

Ответ №2:

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

        <input  
        id="VModel.Email" 
        name="VModel.Email" 
        type="hidden" 
        value="@ViewContext.RouteData.Values["email"]" />

       <input  
        id="VModel.Token" 
        name="VModel.Token" 
        type="hidden" 
        value="@ViewContext.RouteData.Values["token"]" />