在 .net 核心剃刀页面中使用远程属性。参数在控制器的操作方法中没有获取值
Using remote attribute in .net core razor pages. The Parameter does not get value in Action Method of Controller
我正在使用 Remote Attribute validation
该方法在 textchange 事件上成功调用。但是controller的action方法中的参数并没有获取到该字段的值。
这里是HomeController.cs中的动作方法。调用时 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");}
}
[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 请求进行反跳,这样它只会每隔几次击键左右发生一次。否则,你会重蹈覆辙。
我找到了解决方案。
- 删除模型 class 定义中的 部分 。
- 在 Razor 页面中替换
<input asp-for="Keywords.Name" class="form-control" />
和
<input asp-for="Keywords.Name" name="Name" class="form-control" />
我正在使用 Remote Attribute validation 该方法在 textchange 事件上成功调用。但是controller的action方法中的参数并没有获取到该字段的值。
这里是HomeController.cs中的动作方法。调用时 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");}
}
[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 请求进行反跳,这样它只会每隔几次击键左右发生一次。否则,你会重蹈覆辙。
我找到了解决方案。
- 删除模型 class 定义中的 部分 。
- 在 Razor 页面中替换
<input asp-for="Keywords.Name" class="form-control" />
和
<input asp-for="Keywords.Name" name="Name" class="form-control" />