我创建了一个自定义验证属性,并且工作正常:
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" />
}
我不知道为什么会这样。谁能帮我吗?
答案 0 :(得分:1)
最后,我找到了答案只需将ErrorMessage
添加到PageRemote。!
[PageRemote(
ErrorMessage = "آدرس Url پیش تر توسط شما یا دیگری ثبت شده است",
AdditionalFields = "__RequestVerificationToken",
HttpMethod = "post",
PageHandler = "CheckValidations"
)]