.net 5 MVC 多选列表不以多部分形式返回值

Posted

技术标签:

【中文标题】.net 5 MVC 多选列表不以多部分形式返回值【英文标题】:.net 5 MVC multiselectlist not returning values in a multi-part form 【发布时间】:2022-01-06 19:36:13 【问题描述】:

我们有一个包含多个患者和多个不同字段的表单。我们有一个可以选择多个标志的部分。这是表单结果:

我们可以让其他字段提交。但是,标志字段不会发送值。我尝试了几种不同的方法,但我无法在模型中获得任何用于标记的值。

这是我们的患者模型:

public class Patients

    [Key]
    public int Id  get; set; 
    [BindProperty]
    public int CA_ALERTId  get; set; 
    public int? NON_ALERTId  get; set; 
    public string State  get; set; 
    public List<Notes> Notes  get; set; 
    public string Location  get; set; 
    public string OffSiteLocation  get; set; 
    [NotMapped]
    public string Note  get; set; 
    public ICollection<PatientFlags> PatientFlags  get; set; 
    [NotMapped]
    public MultiSelectList FlagsMulti  get; set; 

在视图中,我们将这个用于表单的标志部分:

<td>
      <input type="hidden" asp-for="@Patients.PatientFlags" />
                            
      @html.ListBox("Id", (MultiSelectList)@Patients.FlagsMulti)
</td>

似乎可以正确呈现选项。它似乎也输出了正确的 HTML:

在控制器中:

 public async Task<JsonResult> Edit(Patients patients)
    
        Debug.WriteLine("***Editing Patiient");
        if(patients.Note != null)
        
            await CreateNote(patients);
        
        Patients patient = _context.Patients.Find(patients.Id);
        if(patients.State != null)
        
            patient.State = patients.State;
        
        if (patients.Location != null)
        
            patient.Location = patients.Location;
        
        if (patients.OffSiteLocation != null)
        
            patient.OffSiteLocation = patients.OffSiteLocation;
        
        patient.FlagsMulti = patients.FlagsMulti;
        if(patients.PatientFlags != null)
        
            Debug.WriteLine("*********Adding Patient Flags"+patients.PatientFlags);
            foreach(PatientFlags pf in patients.PatientFlags)
            
                Debug.WriteLine("*******/adding patient flag"+pf.FlagId);
                patient.PatientFlags.Add(pf);
            
            
        
        _context.Update(patient);
        await _context.SaveChangesAsync(); ....

返回的数据不包括 flagsmulti 或 patientflags 的任何内容。

我在网上看到了很多从多选框本身获取结果的示例,他们说您必须接收一个 int 数组。但是,我找不到一个很好的例子来说明多选何时必须成为模型的一部分。任何有关如何从多选中访问此数据以及其他模型数据的帮助将不胜感激。

-- 在@Conman_123 建议后编辑 我将助手更改为:

<select asp-for="@Patients.PatientFlags" asp-items="@Patients.FlagsMulti"></select>

HTML 输出现在是这样的——

但是,我仍然没有在模型中返回任何东西。 patientflags 仍然是空的——

【问题讨论】:

从生成的 HTML 看起来,您的 ViewModel 具有“Patients”对象作为嵌套属性,而您的 Edit 操作的“患者”参数没有嵌套?正在工作的输入的name 属性是否也类似于Patients.Location?还是他们就像Location @Conman_123 其他人的 HTML 看起来像这样 -- 是的,它们工作正常。同样,患者是视图模型中的列表。我只是在此视图中更新患者,但该视图具有来自视图模型中其他模型的一些其他数据。 您可以尝试手动将name 设置为“PatientFlags”(没有嵌套),看看是否有效?通常,如果它实际上位于模型的嵌套属性中,则仅使用“嵌套”属性命名。 【参考方案1】:

您的&lt;select&gt;name 属性设置为“Id”,因此它会尝试绑定到名为“Id”的模型属性。

使用 name 'Patients.PatientFlags' 删除隐藏的输入,并将您的多选更改为具有 name 以便它正确绑定到您的模型。

您可以使用select tag helper 执行此操作。例如:

<select asp-for="Country" asp-items="Model.Countries"></select> 

【讨论】:

感谢您的建议。然而,这似乎并没有解决问题。我仍然得到 0 的计数,请参阅上面的编辑。再次感谢。

以上是关于.net 5 MVC 多选列表不以多部分形式返回值的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5下拉列表用于编辑视图中的多选值绑定

MVC 5 多选列表值未绑定到发布时的模型

MVC 4 多选列表框和选中列表框

如何在 ASP .NET MVC 5 中使用 select2 将新值动态添加到列表框并将其传递给控制器​​?

为啥 Vector<String> 在以多线程样式访问它时不以同步方式运行 [重复]

为啥 Vector<String> 在以多线程样式访问它时不以同步方式运行 [重复]