如何在剃刀编辑页面上仅检索位置/实体关系的过滤值

Posted

技术标签:

【中文标题】如何在剃刀编辑页面上仅检索位置/实体关系的过滤值【英文标题】:How to retrieve only filtered values for location/entity relationship on razor edit page 【发布时间】:2021-11-03 18:03:36 【问题描述】:

我正在从 sql 数据库(实体和位置)中检索两个列表。选择实体后,这会将位置值过滤为仅属于所选实体的那些值。这在创建条目或更改实体时工作正常,新的位置字段会正确填充。但是,当我去编辑现有记录时,会选择正确的位置,但它还会显示所有实体的所有位置,而不仅仅是所选实体的位置。我不希望用户意外选择属于不同实体的位置。

我将以康宁医院为例。它有两个地点,自助餐厅和凉亭2。

当用户尝试编辑现有记录时,它确实选择了正确的位置项(凉亭 2),但它也包含所有其他实体的位置项。

这是我的剃须刀编辑页面

<div class="form-group">
    <label asp-for="SecurityLog.EntityID" class="control-label"></label>
    <select id="entity" asp-for="SecurityLog.EntityID" class="form-control" asp-items="ViewBag.EntityID">
        <option value="">--Select Entity--</option>
    </select>
    <span asp-validation-for="SecurityLog.EntityID" class="text-danger"></span>
</div>
<div class="form-group">
    <label asp-for="SecurityLog.LocationID" class="control-label"></label>
    <select id="location" asp-for="SecurityLog.LocationID" class="form-control" asp-items="ViewBag.LocationID">
        <option value="">--Select Location--</option>
    </select>
    <span asp-validation-for="SecurityLog.LocationID" class="text-danger"></span>
</div>

这里可以根据 onchange 事件过滤位置

$(function () 
            $("#entity").on("change", function() 
                var entity = $(this).val();         
                $("#location").empty();                  
                $("#location").append("<option value=''>--Select Location--</option>");
                $.getJSON(`?handler=Locations&entity=$entity`, (data) => 
                    $.each(data, function (i, item) 
                        $("#location").append(`<option value="$item.value">$item.text</option>`);
                    );
                );
            );
        );

Edit.cshtml.cs

SelectList FilteredLocation;

public JsonResult OnGetLocations()


    FilteredLocation = new SelectList(_context.Location.Where(c => c.EntityID == entity).Where(c => c.Active == "Y").OrderBy(c => c.Name), "ID", "Name");
   
    return new JsonResult(FilteredLocation);






[BindProperty(SupportsGet = true)]
public int entity  get; set; 

[BindProperty(SupportsGet = true)]
public int location  get; set; 

public async Task<IActionResult> OnGetAsync(int? id)
   
    SecurityLog = await _context.SecurityLog.FirstOrDefaultAsync(m => m.ID == id);
    
    //Generating data for select dropdowns
    ViewData["EntityID"] = new SelectList(_context.Entity.Where(a => a.Active == "Y"), "ID", "Name");
    ViewData["LocationID"] = new SelectList(_context.Location.Where(a => a.Active == "Y"), "ID", "Name");
   
    return Page();
 

【问题讨论】:

【参考方案1】:

您需要在此处更改OnGet 方法以显示与当前EntityId 对应的位置:

ViewData["LocationID"] = new SelectList(locations.Where(a => a.Active == "Y" & a.EntityID==SecurityLog.EntityID), "ID", "Name");

【讨论】:

非常感谢。我在想那是我需要做出改变的地方,我只是不知道如何实施它。一如既往地感谢您的帮助。再次感谢!

以上是关于如何在剃刀编辑页面上仅检索位置/实体关系的过滤值的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据中检索实体的唯一关系

如何将剃刀页面包含在另一个剃刀页面中?

abp系列之一张图理清数据过滤器的继承关系

您如何将关系实体表示为 BerkeleyDB 中可检索数据的单个单元?

iOS 使用关系检索和排序 Core Data 实体

核心数据关系,如何从关系中插入和检索数据