Asp.net mvc MVC未分析模型中的正确值

Asp.net mvc MVC未分析模型中的正确值,asp.net-mvc,Asp.net Mvc,有人能告诉我为什么,如果我的模型清楚地显示我的值为“真”或“假”,MVC仍然认为它说“真,假”。我认为这是因为它将请求与我的模型混淆了;然而,我明确地告诉它使用这个模型 如上图所示,模型值为“true”。然而,在下图中,它认为该值为“true,false”。如何使其仅使用“true” 型号 public class TagCategorySearchViewModel { public long Id { get; set; } public string Name { g

有人能告诉我为什么,如果我的模型清楚地显示我的值为“真”或“假”,MVC仍然认为它说“真,假”。我认为这是因为它将请求与我的模型混淆了;然而,我明确地告诉它使用这个模型

如上图所示,模型值为“true”。然而,在下图中,它认为该值为“true,false”。如何使其仅使用“true”

型号

public class TagCategorySearchViewModel
{
    public long Id { get; set; }

    public string Name { get; set; }

    public List<TagSearchViewModel> Tags { get; set; }
}

public class TagSearchViewModel
{
    public long Id { get; set; }

    public string Name { get; set; }

    public bool IsSelected { get; set; }
}
公共类TagCategorySearchViewModel
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共列表标记{get;set;}
}
公共类TagSearchViewModel
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共布尔值被选为{get;set;}
}
控制器

    [Authorize]
    public ActionResult FilterPrereqGrid(EditStudentPrerequisitesViewModel model, int page = 1)
    {
        model.Prerequisites = new List<PrerequisiteListViewModel>();
        var businessPartner = _bpManager.GetBusinessPartnerByMapGuid(model.BusinessPartnerMapGuid);

        model.Prerequisites.AddRange(_epManager.GetFullPrerequisitesLeftJoinedWithExperience(model.ExperienceId, businessPartner?.Id));

        // fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true
        for (int i = 0; i < model.TagCategories?.Count(); i++)
        {
            for (int j = 0; j < model.TagCategories[i].Tags?.Count(); j++)
            {
                model.TagCategories[i].Tags[j].IsSelected = bool.Parse((Request.QueryString[$"TagCategories[{i}].Tags[{j}].IsSelected"] ?? "false").Split(',')[0]);
            }
        }

        var selectedTagIds = model.TagCategories?.SelectMany(x => x.Tags).Where(x => x.IsSelected == true).Select(x => x.Id).ToArray();

        // filter by selected tags
        if (selectedTagIds.Any())
        {
            model.Prerequisites = (from p in model.Prerequisites
                                   let prereqTagIds = p.Prerequisite.PrerequisiteTags.Select(et => et.TagId)
                                   where selectedTagIds.All(x => prereqTagIds.Contains(x))
                                   select p).ToList();
        }

        model.Prerequisites = (from m in model.Prerequisites
                               let ownerDocs = _deManager.GetDocumentsByOwnerAndSourceId(model.BusinessPartnerMapGuid, m.Prerequisite.Id).OrderByDescending(e => e.CreatedDate)
                               select new PrerequisiteListViewModel
                               {
                                   Prerequisite = m.Prerequisite,
                                   Selected = m.Selected,
                                   Mandatory = m.Mandatory,
                                   HasExpiration = m.Prerequisite.HasExpiration,
                                   BusinessExpirationPeriod = m.Prerequisite.ExpirationPeriod == 0 ? "None" : m.Prerequisite.ExpirationPeriod.ToString(),
                                   DocOwnerGuid = (ownerDocs.Any() ? model.BusinessPartnerMapGuid : Guid.Empty),
                                   DocRowGuid = (ownerDocs.Any() ? ownerDocs.First().DocRowguid : Guid.Empty),
                                   HasDocuments = ownerDocs.Any()
                               }).ToList();

        int rowsPerPage = 1;

        model.TotalRecords = model.Prerequisites.Count();
        model.Prerequisites = model.Prerequisites.Skip(page * rowsPerPage - rowsPerPage).Take(rowsPerPage).ToList();

        return PartialView("~/Views/BusinessExperience/_EditPrerequisites.cshtml", model);
    }
[授权]
public ActionResult FilterPrereeqGrid(EditStudentPrerequisitesViewModel模型,int page=1)
{
model.premissions=新列表();
var businessPartner=\u bpManager.GetBusinessPartnerByMapGuid(model.BusinessPartnerMapGuid);
model.premissions.AddRange(_epManager.getFullPremissionsLeftJoinedwithExperience(model.ExperienceId,businessPartner?.Id));
//修正了MVC绑定复选框的方式…它发送“true,false”而不是“just true”,所以我们需要得到true
对于(int i=0;ix.Tags)。其中(x=>x.IsSelected==true)。选择(x=>x.Id).ToArray();
//按所选标记筛选
if(selectedtagds.Any())
{
model.premissions=(来自model.premissions中的p)
让prerequestagids=p.PrerequisiteTags.Select(et=>et.TagId)
其中selectedtagds.All(x=>prereqTagIds.Contains(x))
选择p.ToList();
}
model.premissions=(来自model.premissions中的m)
让ownerDocs=\u deManager.GetDocumentsByOwnerAndSourceId(model.BusinessPartnerMapGuid,m.Prerequisite.Id)。OrderByDescending(e=>e.CreatedDate)
选择新的PrerequisiteListViewModel
{
先决条件=m.先决条件,
选定=m.选定,
强制性=m.强制性,
haseexpiration=m.Prerequisite.haseexpiration,
BusinessExpirationPeriod=m.Prerequisite.ExpirationPeriod==0?“无”:m.Prerequisite.ExpirationPeriod.ToString(),
DocOwnerGuid=(ownerDocs.Any()?model.BusinessPartnerMapGuid:Guid.Empty),
DocRowGuid=(ownerDocs.Any()?ownerDocs.First().DocRowGuid:Guid.Empty),
HasDocuments=ownerDocs.Any()
}).ToList();
int rowsPerPage=1;
model.TotalRecords=model.premissions.Count();
model.premissions=model.premissions.Skip(page*rowsPerPage-rowsPerPage).Take(rowsPerPage.ToList();
返回PartialView(“~/Views/BusinessExperience/\u editspremissions.cshtml”,model);
}

这是出于设计。
Html.CheckBoxFor
扩展实际上呈现如下内容:

<input type="checkbox" .. />
<input type="hidden" />

因此,这两个属性与要渲染的属性具有相同的名称。选中时,复选框返回“True”,但未选中时,复选框不返回任何内容。这就是复选框处理表单帖子的方式。为了确定未检查任何内容,MVC框架包含一个隐藏字段,以便在未检查时返回“False”,而在检查时返回“True,False”(因为具有相同名称的多个项以这种方式从表单post返回)。然后MVC模型绑定将“True,False”转换为True


您可以只渲染自己的
,值为true,这只会返回true,但如果不选中,则不会渲染任何内容。请注意……

这是出于设计。
Html.CheckBoxFor
扩展实际上呈现如下内容:

<input type="checkbox" .. />
<input type="hidden" />

因此,这两个属性与要渲染的属性具有相同的名称。选中时,复选框返回“True”,但未选中时,复选框不返回任何内容。这就是复选框处理表单帖子的方式。为了确定未检查任何内容,MVC框架包含一个隐藏字段,以便在未检查时返回“False”,而在检查时返回“True,False”(因为具有相同名称的多个项以这种方式从表单post返回)。然后MVC模型绑定将“True,False”转换为True


您可以只渲染自己的
,值为true,这只会返回true,但如果不选中,则不会渲染任何内容。请注意…

这确实有效,但遗憾的是我不能以显而易见的方式完成这一切

@model List<Prep2PracticeWeb.Models.ViewModels.TagCategorySearchViewModel>

@if (Model != null)
{
    <div class="tag-categories">
        @for (int i = 0; i < Model.Count(); i++)
        {
            @Html.HiddenFor(x => Model[i].Id)
            @Html.HiddenFor(x => Model[i].Name)
            <h4 data-toggle="collapse" data-target="#CollapsableTagCategory_@Model[i].Id" aria-expanded="false" aria-controls="CollapsableTagCategory_@Model[i].Id">
                <span class="glyphicon glyphicon-chevron-right"></span>
                <span class="glyphicon glyphicon-chevron-down"></span>
                @Model[i].Name
            </h4>
                            <div id="CollapsableTagCategory_@Model[i].Id" class="tag-container collapse">
                                @if (Model[i].Tags != null)
                                {
                                    for (int j = 0; j < Model[i].Tags.Count(); j++)
                                    {
                                        @Html.HiddenFor(x => Model[i].Tags[j].Id)
                                        @Html.HiddenFor(x => Model[i].Tags[j].Name)
                                        @* the following commented out line won't work because MVC is funny *@
                                        @*<label>@Html.CheckBoxFor(x => Model[i].Tags[j].IsSelected) @Model[i].Tags[j].Name</label>*@
                                        <label>
                                            <input @(Model[i].Tags[j].IsSelected ? @"checked=""checked""" : string.Empty) data-val="true" data-val-required="The IsSelected field is required." id="TagCategories_@(i)__Tags_@(j)__IsSelected" name="TagCategories[@i].Tags[@j].IsSelected" type="checkbox" value="true"> @Model[i].Tags[j].Name
                                            <input name="TagCategories[@i].Tags[@j].IsSelected" type="hidden" value="false">
                                        </label>
                                    }
                                }
                            </div>
        }
    </div>
}
@型号列表
@如果(型号!=null)
{
@对于(int i=0;iModel[i].Id)
@Html.HiddenFor(x=>Model[i].Name)
@型号[i].名称
@if(型号[i]。标记!=null)
{
对于(int j=0;j