【问题标题】:Using remote attribute in .net core razor pages. The Parameter does not get value in Action Method of Controller在 .net core razor 页面中使用远程属性。参数在控制器的动作方法中没有取值
【发布时间】:2020-01-12 04:12:36
【问题描述】:

我正在使用Remote Attribute validation 该方法在 textchange 事件上成功调用。但是控制器的action方法中的参数并没有获取到该字段的值。

这是 HomeController.cs 中的 Action 方法。调用时,Name 参数 仍为 null。如果有人能解决这个问题,我会很高兴

    [AcceptVerbs("Get", "Post")]
    public async Task<ActionResult> IsExist(string Name)
    {
        List<Keywords> keywords = new List<Keywords>();
        HttpClient client = _api.Initial();
        HttpResponseMessage res = await client.GetAsync("api/Keywords");
        if (res.IsSuccessStatusCode)
        {
            var result = res.Content.ReadAsStringAsync().Result;
            keywords = JsonConvert.DeserializeObject<List<Keywords>>(result);
        }
        if (keywords.FirstOrDefault(x => x.Name == Name) == null)
        {
            return Json(false);
        }
        else
        {
            return Json(true);
        }}

这是模型

 public partial class Keywords
{
    public int Id { get; set; }
    [Display(Name = "Name of Keyword")]
    [Required]   
    [Remote(action: "IsExist",controller: "Home", ErrorMessage = "Keyword already present!")]
    public string Name { get; set; }}

这是我要实现验证的剃须刀页面

    @page
    @model Consumer.Pages.Keyword.CreateModel

    @{
        ViewData["Title"] = "Create";
     }
<h1>Create</h1>

<h4>Keywords</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Keywords.Name" class="control-label"></label>
                <input asp-for="Keywords.Name" class="form-control" />
                <span asp-validation-for="Keywords.Name" class="text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="Keywords.Department" class="control-label"></label>
                <select asp-for="Keywords.DepartmentId" class="form-control" asp-items="ViewBag.Department"></select>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

【问题讨论】:

    标签: validation controller asp.net-core-mvc razor-pages unique-constraint


    【解决方案1】:

    我找到了解决方案。是为了

    1. 移除模型类定义中的部分
    2. 在 Razor 页面中替换
    <input asp-for="Keywords.Name" class="form-control" />
    

    <input asp-for="Keywords.Name" name="Name" class="form-control" />
    

    【讨论】:

      【解决方案2】:

      [Remote] 属性几乎毫无用处。从 ASP.NET MVC 时代开始,存在一个长期存在的问题,即迁移到 ASP.NET Core 的方式也有增无减。也就是说,处理远程的操作必须采用与正在验证的内容的输入名称相匹配的参数。换句话说,您的操作需要一个参数name,但发送给它的是Keywords.Name,它不能绑定到name。您必须执行以下操作:

      public async Task<ActionResult> IsExist(Keywords keywords)
      

      然后,该值将通过keywords.Name 提供。这显然使用法高度依赖于特定的实现,因此如果出现输入名称不同的情况,例如Foo.Keywords.Name,那么您需要一个完全不同的操作来匹配该绑定,并基本上复制逻辑(尽管您可以将大部分逻辑分解为所有操作都可以使用的一些通用方法。

      长短,您最好自己手动处理。只需绑定到名称输入上的input 事件,然后通过 AJAX 调用您的方法。然后,您可以显式控制在请求正文中发送的密钥,使其始终与您的操作相匹配。请注意,您还需要对发送该 AJAX 请求进行去抖动处理,以便每隔几次击键左右发生一次。否则,您将采取行动。

      【讨论】:

        猜你喜欢
        • 2019-11-13
        • 2020-04-03
        • 2020-01-27
        • 1970-01-01
        • 2020-05-04
        • 2021-04-13
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多