Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过post方法将通用值绑定回控制器_C#_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 通过post方法将通用值绑定回控制器

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> {

当通过post方法将泛型值发送回控制器时,我不知道如何从视图绑定回泛型值

我有一个从GenericModel继承的泛型类PageModel。PageModel有额外的参数Page(类有两个int参数pageSize和pageNumber)。GenericModel只有名为viewModel的T的泛型值,仅此而已。问题是标准C#binder绑定页面参数时没有任何问题,但无论我尝试做什么,ViewModel都不会被填充

型号:

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"  ...>
    
    <label asp-for="ViewModel.Roles"></label> <input type="text" asp-for="ViewModel.Roles" class="form-control" hidden="hidden" /> <span asp-validation-for="ViewModel.Roles" class="text-danger"></span> @for(var i=0; i < Model.ViewModel.Roles.Count(); i++) { <input type="hidden" name="ViewModel.Roles[]" value="@Model.ViewModel.Roles[i]" /> }
    @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"  ...>
    
    <label asp-for="ViewModel.Roles"></label> <input type="text" asp-for="ViewModel.Roles" class="form-control" hidden="hidden" /> <span asp-validation-for="ViewModel.Roles" class="text-danger"></span> @for(var i=0; i < Model.ViewModel.Roles.Count(); i++) { <input type="hidden" name="ViewModel.Roles[]" value="@Model.ViewModel.Roles[i]" /> }
    @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"  ...>
    
    <label asp-for="ViewModel.Roles"></label> <input type="text" asp-for="ViewModel.Roles" class="form-control" hidden="hidden" /> <span asp-validation-for="ViewModel.Roles" class="text-danger"></span> @for(var i=0; i < Model.ViewModel.Roles.Count(); i++) { <input type="hidden" name="ViewModel.Roles[]" value="@Model.ViewModel.Roles[i]" /> }
    @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>
    }