自定义验证属性确实显示了不正确的错误消息,aspnet core 3

时间:2019-12-02 08:47:39

标签: asp.net-core

我创建了一个自定义验证属性,并且工作正常:

 public sealed class DuplicateUrlCheckerAttribute : ValidationAttribute
    {
        public string GetErrorMessage() => $"آدرس Url پیش تر توسط شما یا دیگری ثبت شده است";

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {

            var service = (IOrderValidationService)validationContext.GetService(typeof(IOrderValidationService));

            if (service.DuplicateUrl(value.ToString()))
            {
                return new ValidationResult(GetErrorMessage());
            }

            return ValidationResult.Success;
        }

    }

并且我在剃刀页面中将其用作远程验证(远程页面):

 public class IndexModel : PageModel
    {
        readonly IViewerOrderService _viewerOrderService;

        public IndexModel(IViewerOrderService viewerOrderService)
        {
            _viewerOrderService = viewerOrderService;
        }

        [PageRemote(
         AdditionalFields = "__RequestVerificationToken",
         HttpMethod = "post",
         PageHandler = "CheckValidations"
        )]
        [BindProperty]
        public Order Order { get; set; }

        [Required]
        [Url]
        [RegularExpression(@"^(https?\:\/\/)?(www\.youtube\.com|youtu\.?be)\/.+$", ErrorMessage = "آدرس معتبر از سایت یوتیوب وارد کنید.")]
        [DuplicateUrlChecker]
        [PageRemote(
         AdditionalFields = "__RequestVerificationToken",
         HttpMethod = "post",
         PageHandler = "CheckValidations"
        )]
        [BindProperty]
        public string DuplicateUrl { get; set; }

        public void OnGet()
        {

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



            Order.LinkUrl = DuplicateUrl;

            if (await _viewerOrderService.AddOrder(Order, cancelationToken))
            {
                TempData.Set("newOrder", Order);
                return RedirectToPage("ThankYou");
            }


            return Page();


        }


        public JsonResult OnPostCheckValidations()
        {
            if (!ModelState.IsValid)
                return new JsonResult(false);


            return new JsonResult(true);
        }
    }

仍然可以正常工作,但是问题是,不能正确显示ErrorMessage。在视图中显示此错误

  

آدرسUrlپیشترتوسطشمایادیگریثبتشدهاست“

,显示

  

“ DuplicateUrl”无效。

即使我使用了[DuplicateUrlChecker(ErrorMessage = "آدرس Url پیش تر توسط شما یا دیگری ثبت شده است"),但仍然显示

  

DuplicateUrl'无效。

视图是:

@page "{handler?}"
@model MakeMoney.Web.Pages.IndexModel
@using MakeMoney.Domain.Models.LinkOrder;
@{
  ViewData["Title"] = "دانلود ویدیو ";
}

<form id="wrapped" asp-page="/Index" method="POST">
  <input id="website" name="website" type="text" value="">
  <!-- Leave input above for security protection, read docs for details -->
  <div id="middle-wizard">
    <!-- First branch What Type of Project ============================== -->

...

  <!-- Last step ============================== -->
      <div class="submit step" id="end">
        <div class="question_title">
          <h3>فرم مشخصات</h3>
          <p>لطفا فیلد ها را با دقت پر کنید</p>
        </div>
        <div class="row justify-content-center">
          <div class="col-lg-5">
            <div class="box_general">
              <div class="form-group">
                <input type="email" asp-for="Order.Email" class="required form-control" title="لطفا ایمیل خود را وارد کنید" placeholder="ایمیل">
                <span class="text-danger" asp-validation-for="Order.Email"></span>
              </div>
              <div class="checkbox_questions">
                <input asp-for="Order.Inform" type="checkbox" class="icheck">
                <label>هر زمان روی کانال قرار گرفت مرا باخبرساز</label>
                <span class="text-danger" asp-validation-for="Order.Inform"></span>

              </div>
              <div class="form-group">
                <input type="text" asp-for="DuplicateUrl" class="required form-control" pattern="^(http\:\/\/)?(www\.youtube\.com|youtu\.?be)\/.+$" title="آدرس Url را وارد کنید" placeholder="لینک موردنظر" required>
                <span class="text-danger" asp-validation-for="DuplicateUrl"></span>

              </div>
              <div class="form-group add_bottom_30">
                <label>زیرنویس:</label>
                <div class="styled-select">
                  <select asp-for="Order.SubtitleType" class="required" asp-items="@Html.GetEnumSelectList<SubtitleType>()">
                  </select>
                  <span class="text-danger" asp-validation-for="Order.SubtitleType"></span>

                </div>
              </div>
              <div class="checkbox_questions">
                <input name="terms" type="checkbox" class="icheck required" value="yes" title="اجباری">
                <label> قبول <a href="#" data-toggle="modal" data-target="#terms-txt">شرایط و ضوابط</a></label>
              </div>
            </div>
            <!-- /box_general -->
          </div>
        </div>
        <!-- /row -->
      </div>
      <!-- /Last step ============================== -->
    </div>
  </div>
  <!-- /middle-wizard -->
  <div id="bottom-wizard">
    <button type="button" name="forward" class="forward">بعدی</button>
    <button type="submit" name="process" class="submit">ارسال</button>
    <button type="button" name="backward" class="backward">قبلی</button>
  </div>
  <!-- /bottom-wizard -->
</form>



@section Scripts {
  <partial name="_ValidationScriptsPartial" />
}

我不知道为什么会这样。谁能帮我吗?

1 个答案:

答案 0 :(得分:1)

最后,我找到了答案只需将ErrorMessage添加到PageRemote。!

     [PageRemote(
            ErrorMessage = "آدرس Url پیش تر توسط شما یا دیگری ثبت شده است",
         AdditionalFields = "__RequestVerificationToken",
         HttpMethod = "post",
         PageHandler = "CheckValidations"
        )]