C# 通过post方法将通用值绑定回控制器
当通过post方法将泛型值发送回控制器时,我不知道如何从视图绑定回泛型值 我有一个从GenericModel继承的泛型类PageModel。PageModel有额外的参数Page(类有两个int参数pageSize和pageNumber)。GenericModel只有名为viewModel的T的泛型值,仅此而已。问题是标准C#binder绑定页面参数时没有任何问题,但无论我尝试做什么,ViewModel都不会被填充 型号:C# 通过post方法将通用值绑定回控制器,c#,.net-core,asp.net-core-mvc,C#,.net Core,Asp.net Core Mvc,当通过post方法将泛型值发送回控制器时,我不知道如何从视图绑定回泛型值 我有一个从GenericModel继承的泛型类PageModel。PageModel有额外的参数Page(类有两个int参数pageSize和pageNumber)。GenericModel只有名为viewModel的T的泛型值,仅此而已。问题是标准C#binder绑定页面参数时没有任何问题,但无论我尝试做什么,ViewModel都不会被填充 型号: public class GenericModel<T> {
public class GenericModel<T>
{
public T ViewModel { get; set; }
public GenericModel(T viewModel)
{
ViewModel = viewModel;
}
public GenericModel()
{
}
}
public class PageModel<T> : GenericModel<T>
{
public Page Page { get; set; }
public PageModel(T viewModel, Page page) : base(viewModel)
{
Page = page;
}
public PageModel() : base()
{
}
}
编辑2
我已经将disable标记从id改为readonly,现在正在发送id。我不认为我已经改变了其他任何东西,但我认为多亏了添加了其他每一个属性,但我仍然保留了角色。还有一个问题。角色根本不受约束
ViewModel.Id: fde0b182-3b24-4d5b-b31e-3680b7cfd4de
ViewModel.Password: 19923845379
ViewModel.ConfirmPassword: 1284326898838
ViewModel.Roles: System.Collections.Generic.List`1[System.String]
Page.PageNumber: 1
Page.PageSize: 5
newRoles: Administrator
newRoles: User
__RequestVerificationToken: CfDJ8Hsh_QOxexZLjyWnCjnNzz1Hy5YNNny4vPyGFd434Uybuo-O-dMFHT7eSKvd7JKA_dqxlQDIFlNzVsSjTDT6lzl7d2AU6Pj1nVRUyux3OZ2cGbyyBVKZHUI0Kq4u_MAx_b_29SUVSYh5Tpayc-0WPdcjGfxKLvL1qrbn6qeHcNk356VsPG1AC5cphft3frjILA
编辑3[已解决]
多亏@itness的帮助,我才能解决这个问题。在下面,您已使用相同的两个版本更改了表单-角色
<form asp-controller="Admin" asp-action="Update" method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="ViewModel.Id"></label>
<input type="text" asp-for="ViewModel.Id" readonly class="form-control" />
<span asp-validation-for="ViewModel.Id" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ViewModel.Password"></label>
<input type="password" asp-for="ViewModel.Password" class="form-control" />
<span asp-validation-for="ViewModel.Password" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ViewModel.ConfirmPassword"></label>
<input type="password" asp-for="ViewModel.ConfirmPassword" class="form-control" />
<span asp-validation-for="ViewModel.ConfirmPassword" class="text-danger"></span>
</div>
@for(int i = 0; i < Model.ViewModel.Roles.Count(); i++) {
<div class="form-group">
<label asp-for="ViewModel.Roles[i]"></label>
<input type="text" asp-for="ViewModel.Roles[i]" class="form-control" hidden="hidden" />
<span asp-validation-for="ViewModel.Roles[i]" class="text-danger"></span>
</div>
}
<div class="form-group">
<input type="number" asp-for="Page.PageNumber" class="form-control" hidden="hidden" />
<span asp-validation-for="Page.PageNumber" class="text-danger"></span>
</div>
<div class="form-group">
<input type="number" asp-for="Page.PageSize" class="form-control" hidden="hidden" />
<span asp-validation-for="Page.PageSize" class="text-danger"></span>
</div>
@foreach (var availableRole in (IList<IdentityRole>)ViewData["AllRoles"])
{
<div class="form-check">
<input class="form-check-input" type="checkbox" name="ViewModel.NewRoles[]" value="@availableRole.Name"
checked="@Model.ViewModel.Roles.Contains(availableRole.Name)">
<label class="form-check-label">@availableRole</label>
</div>
}
<button type="submit" class="btn btn-success">Change</button>
</form>
命名惯例错了吗
对。名称约定为:
)表示属性[]
表示集合索引或字典NewRoles
字段的名称为NewRoles
:
<input ... name="newRoles" ...>
@foreach (var availableRole in (IList<IdentityRole>)ViewData["AllRoles"])
{
<div class="form-check">
<input class="form-check-input" type="checkbox"
name="ViewModel.NewRoles[]"
value="@availableRole.Name"
checked="@Model.ViewModel.Roles.Contains(availableRole.Name)">
<label class="form-check-label">@availableRole</label>
</div>
}
新角色
:
<input ... name="newRoles" ...>
@foreach (var availableRole in (IList<IdentityRole>)ViewData["AllRoles"])
{
<div class="form-check">
<input class="form-check-input" type="checkbox"
name="ViewModel.NewRoles[]"
value="@availableRole.Name"
checked="@Model.ViewModel.Roles.Contains(availableRole.Name)">
<label class="form-check-label">@availableRole</label>
</div>
}
@foreach(在(IList)ViewData[“所有角色”]中的var availableRole)
{
@可用资源
}
谢谢,但我想我的问题还不够清楚。我的整个ViewModel没有得到它的值,它是PageModel的通用属性,在我决定对所有视图使用一个通用模型之前,它就像一个符咒一样工作,在添加了t之后,它就停止了。@Stablo您的SDK版本是什么。我上面的代码使用ASP.NET Core 3.1.00,它对我来说很好(除了Email属性(因为你没有渲染它)和Id)。我可以正确地获得密码/角色/新角色,只需检查一下,它的.NETCore2.1适用于逻辑项目,2.2适用于逻辑项目mvc@Stablo请您也在浏览器中按F12,并向我们显示您发送给服务器的有效负载,好吗?当然可以,但我目前所在的计算机没有project的实际版本-我还没有推送它。如果没有问题的话,我可以在6小时内完成
<input ... name="newRoles" ...>
@foreach (var availableRole in (IList<IdentityRole>)ViewData["AllRoles"])
{
<div class="form-check">
<input class="form-check-input" type="checkbox"
name="ViewModel.NewRoles[]"
value="@availableRole.Name"
checked="@Model.ViewModel.Roles.Contains(availableRole.Name)">
<label class="form-check-label">@availableRole</label>
</div>
}