如何将页面模型对象属性连接到 <select> 标记中的对象列表来自 db? ASP.NET Razor 页面

问题描述

武器模型:

public class Weapon {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Basedamage { get; set; } // base damage with average attack
        public int Magicdamage { get; set; }
        public int ActionCost { get; set; }
        public int HitChance { get; set; }
    }

生物模型包含一些简单的属性,如 Id 和武器。

我正在尝试使用数据库中的武器创建下拉列表,并在通过按钮提交表单时将所选武器添加到 Creature 对象中。

页面模型包含 Creature 对象和武器列表:

public Creature Creature { get; set; }
public IEnumerable<Weapon> Weapons { get; set; }

OnGet 方法加载选定的生物和武器列表。

public void OnGetDetails(int id,int toggle)        {
            Creature = new GetCreature(_ctx).Get(id);
            LastToggle = toggle;            
            Weapons = new GetWeapons(_ctx).Get();
}

一个想法:

<form method="post">
    <input type="hidden" asp-for="Creature.Id"/>
    <select id="weapon" class="form-control bg-secondary text-light" asp-for="Creature.Weapon" asp-items="@Model.Weapons">        
    </select>

    <button type="submit" class="btn btn-outline-warning m-2" asp-page-handler="UpdateWeapon">Wybierz</button>                       
</form>

但是 VS 不接受 asp-items="@Model.Weapons":
CS0266:无法将类型“System.Collection.Generic.IEnumerable”隐式转换为“System.Collections.GenericIEnumerable”。存在显式对话(您是否缺少演员表?)

第二个想法(更新[以前的版本有 value="@item.Id"]):

<form method="post">
    <input type="hidden" asp-for="Creature.Id"/>
    <select id="weapon" class="form-control bg-secondary text-light" asp-for="Creature.Weapon">
        @foreach (var item in Model.Weapons) {
            <option value="@item">@item.Name - @item.Basedamage | @item.Magicdamage | @item.ActionCost PA | @item.HitChance%</option>
            }
    </select>

    <button type="submit" class="btn btn-outline-warning m-2" asp-page-handler="UpdateWeapon">Wybierz</button>                       
</form>

还是不行。不要抛出错误,但 Creature.Weapon 仍然为空,不会从选择列表中传递。

发布方法

public async Task<IActionResult> OnPostUpdateWeaponAsync() {
            var item = _ctx.Creatures.Find(Creature.Id);

            if (item == null)
            {
                return RedirectToPage("Creature");
            }

            if (Creature.Weapon == null)
            {
                return RedirectToPage("Creature");
            }

            await new EditCreature(_ctx).UpdateWeapon(Creature);
                        
            return RedirectToPage("Creature");
        }

生物模型:https://github.com/Mlorism/LastTemple/blob/master/LastTemple/Models/Creature.cs
武器型号:https://github.com/Mlorism/LastTemple/blob/master/LastTemple/Models/Weapon.cs

页面
https://github.com/Mlorism/LastTemple/blob/master/LastTemple/Pages/Manage/Creature.cshtml.cs

https://github.com/Mlorism/LastTemple/blob/master/LastTemple/Pages/Manage/Creature.cshtml

解决方法

第二个想法:

<form method="post">
    <input type="hidden" asp-for="Creature.Id" />
    <select id="weapon" class="form-control bg-secondary text-light" asp-for="Creature.Weapon">
        @foreach (var item in Model.Weapons)
        {
            <option value="@item.Id">@item.Name - @item.BaseDamage | @item.MagicDamage | @item.ActionCost PA | @item.HitChance%</option>
        }
    </select>

    <button type="submit" class="btn btn-outline-warning m-2" asp-page-handler="UpdateWeapon">Wybierz</button>
</form>

还是不行。不要抛出错误,但 Creature.Weapon 仍然为空, 不是从选择列表中传递的。

您正在绑定武器 ID,所以

改变

asp-for="Creature.Weapon"

asp-for="Creature.Weapon.Id"