使用 jQuery 填充输入标签,然后通过模型绑定提交给 ASP.NET Core
Populate input tags using jQuery and then submit to ASP.NET Core through model binding
我正在编写 ASP.NET 核心 MVC 3.1 应用程序的一部分,管理员在其中向应用程序添加新用户。可以有域用户和本地用户,所以计划是给管理员一个 select 标签(Domain/Local),一个带有第 3 方自动完成库的输入标签,用于在符合条件的域用户中进行搜索操作,以及一系列用于手动插入新本地用户的普通输入标签。
当管理员搜索域用户时,序列化的 json 用作源,然后 selected 用户 ID、名字和第二名从自动完成源复制到手动输入标签(本地用户也可以直接使用)。最后,这些输入标签的值用作发送到操作方法的模型的绑定源。
我有一个相当简单的 ViewModel:
public class UserCreateModel
{
[BindNever]
public List<SelectListItem> AvailableDomains { get; }
[BindNever]
public string EligibleUsers { get; set; }
[Required]
public UserDomain SelectedDomain { get; set; }
[Display(Name = "Id Utente")]
[Required]
public string Id { get; set; }
[Required]
public string Nome { get; set; }
[Required]
public string Cognome { get; set; }
}
EligibleUsers
属性是一个List<EligibleUserModel>
实例的序列化:
public class EligibleUserModel
{
public string text { get; set; }
public string link { get; set; }
public string cognome { get; set; }
public string nome { get; set; }
}
这是关联的视图,其中我只保留了基本的 html 代码,删除了所有标签、类 和与问题无关的属性:
@model UserCreateModel
<form method="post">
<fieldset>
<select asp-for="SelectedDomain" asp-items="Model.AvailableDomains"></select>
</fieldset>
<fieldset class="add-domain-user">
<input type="search" class="autocomplete"
id="autocomplete-users"
name="autocomplete-users"
data-autocomplete='@Model.EligibleUsers'
</fieldset>
<fieldset disabled>
<input asp-for="Id" type="text" class="form-control"/>
<input asp-for="Cognome" type="text" class="form-control"/>
<input asp-for="Nome" type="text" class="form-control"/>
</fieldset>
<button asp-controller="Account" asp-action="AddUser" type="submit">Conferma</button>
</form>
data-autocomplete
属性是第三方库的一部分,它接收要添加的所有符合条件的用户的 JSON,并动态地将锚标记列表附加到输入标记。使用一些 jQuery,我填充了 Id、Cognome 和 Nome 输入标签。 :
$('form .add-domain-user').on('click', '.autocomplete-list li a', function (event) {
event.preventDefault();
// the href attribute comes with the 3rd-party lib, and is the only way
// for me to get the selected user Id
var id = $(this).attr('href');
var userList = $('.add-domain-user input[type="search"]').data()["autocomplete"];
var selectedUser = userList.find(el => el.link === id);
$('#Id').val(selectedUser.link);
$('#Cognome').val(selectedUser.cognome);
$('#Nome').val(selectedUser.nome);
});
现在,问题是当我在输入标签中手动输入文本时,它们被正确绑定并发送到操作方法。当我尝试从自动完成列表中 selecting 域用户时,我可以在输入标签中看到值,但没有值绑定到模型。
最后,正是 disabled
属性阻止了表单 post 任何事情。更改为 readonly
并且有效。
我正在编写 ASP.NET 核心 MVC 3.1 应用程序的一部分,管理员在其中向应用程序添加新用户。可以有域用户和本地用户,所以计划是给管理员一个 select 标签(Domain/Local),一个带有第 3 方自动完成库的输入标签,用于在符合条件的域用户中进行搜索操作,以及一系列用于手动插入新本地用户的普通输入标签。
当管理员搜索域用户时,序列化的 json 用作源,然后 selected 用户 ID、名字和第二名从自动完成源复制到手动输入标签(本地用户也可以直接使用)。最后,这些输入标签的值用作发送到操作方法的模型的绑定源。
我有一个相当简单的 ViewModel:
public class UserCreateModel
{
[BindNever]
public List<SelectListItem> AvailableDomains { get; }
[BindNever]
public string EligibleUsers { get; set; }
[Required]
public UserDomain SelectedDomain { get; set; }
[Display(Name = "Id Utente")]
[Required]
public string Id { get; set; }
[Required]
public string Nome { get; set; }
[Required]
public string Cognome { get; set; }
}
EligibleUsers
属性是一个List<EligibleUserModel>
实例的序列化:
public class EligibleUserModel
{
public string text { get; set; }
public string link { get; set; }
public string cognome { get; set; }
public string nome { get; set; }
}
这是关联的视图,其中我只保留了基本的 html 代码,删除了所有标签、类 和与问题无关的属性:
@model UserCreateModel
<form method="post">
<fieldset>
<select asp-for="SelectedDomain" asp-items="Model.AvailableDomains"></select>
</fieldset>
<fieldset class="add-domain-user">
<input type="search" class="autocomplete"
id="autocomplete-users"
name="autocomplete-users"
data-autocomplete='@Model.EligibleUsers'
</fieldset>
<fieldset disabled>
<input asp-for="Id" type="text" class="form-control"/>
<input asp-for="Cognome" type="text" class="form-control"/>
<input asp-for="Nome" type="text" class="form-control"/>
</fieldset>
<button asp-controller="Account" asp-action="AddUser" type="submit">Conferma</button>
</form>
data-autocomplete
属性是第三方库的一部分,它接收要添加的所有符合条件的用户的 JSON,并动态地将锚标记列表附加到输入标记。使用一些 jQuery,我填充了 Id、Cognome 和 Nome 输入标签。 :
$('form .add-domain-user').on('click', '.autocomplete-list li a', function (event) {
event.preventDefault();
// the href attribute comes with the 3rd-party lib, and is the only way
// for me to get the selected user Id
var id = $(this).attr('href');
var userList = $('.add-domain-user input[type="search"]').data()["autocomplete"];
var selectedUser = userList.find(el => el.link === id);
$('#Id').val(selectedUser.link);
$('#Cognome').val(selectedUser.cognome);
$('#Nome').val(selectedUser.nome);
});
现在,问题是当我在输入标签中手动输入文本时,它们被正确绑定并发送到操作方法。当我尝试从自动完成列表中 selecting 域用户时,我可以在输入标签中看到值,但没有值绑定到模型。
最后,正是 disabled
属性阻止了表单 post 任何事情。更改为 readonly
并且有效。