繁体   English   中英

使用 ASP.NET MVC,用户如何根据在 SelectList 中选择的内容发布 model?

[英]With ASP.NET MVC, how can users POST a model dependent on what was selected in a SelectList?

在我的应用程序中,我有一个创建 object 的所需流程。

只是为了演示,我会说我的 object 是“口袋妖怪”。 所以我有一个“口袋妖怪”的界面,其中包含与所有这些相关的统计信息,例如:

public interface IPokemon
{
        string Type { get; set; }
        public static List<SelectListItem> TypeList { get; }
        int HPStat { get; set; }
        int ATKStat { get; set; }
        int DEFStat { get; set; }
        int SPATKStat { get; set; }
        int SPDEFStat { get; set; }
}

然后我有一个抽象的Pokemon class:

public abstract class Pokemon : IPokemon
{
    public static List<SelectListItem> TypeList { get; } = new List<SelectListItem>
    {   new SelectListItem { Value = "Bulbasaur", Text = "Bulbasaur" },
        new SelectListItem { Value = "Squirtle", Text = "Squirtle" },
        new SelectListItem { Value = "Charmander", Text = "Charmander" }
    };
    // also implements each of the int Stats
}

在 HTML 中,我将 select 绑定到TypeList ,用于 IPokemon 接口上的字符串Type 从服务器传来的Bulbasaur默认是一只妙蛙种子。

<select asp-for="Type" asp-items="IPokemon.TypeList"></select>

当我尝试 POST 结果时,出现错误,因为无法初始化IPokemon

我明白错误发生的原因,但我无法弄清楚什么是构建整个交互的最佳方式。 我假设我想根据用户的选择返回不同的 model object,但我也认为我可能对一般情况下应该如何构建有错误的解释。

在这一步之后,我想我会根据返回的内容创建正确的 model Object,然后根据在第一步中选择的Pokemon class 允许某些选项来继续创建过程。 一个例子; 如果在此步骤中选择了 Squirtle,我想转到一个允许选择不同“水类型”动作的页面。

欢迎任何澄清或指向资源以了解如何实现这一目标。

这里有几点建议:

首先,我想知道你是否真的想制作你的Pokemon.TypeList static? 目前,你拥有它的方式意味着每个 object 类型的Pokemon (或其任何子类)都将拥有所有Pokemon类型的列表。 这似乎有很多数据重复。

其次,在您的组合框中,您有asp-items="IPokemon.TypeList"TypeList object 目前位于Pokemon class 中,而不是在IPokemon界面中。 我希望这是一个错字,你实际上想指向Pokemon.TypeList 此外,您实际上不会真正拥有位于接口内的类型列表。 他们最好坐在基地 class 或什至就在他们自己的 static class 其他地方。

第三,关于结构:如果你所有的Pokemon对象都继承自你的抽象基础 class,在我看来,将你所有的抽象IPokemon方法放在你的基础 class 中更有意义,因为添加一个额外的接口只会真正增加这里的复杂性。

我记得读过一件事,比如 inheritance 和接口,这让我印象深刻:当 inheritance 树在学术环境中被教授时,它的前提是你将拥有一个非常分层的 inheritance 结构(例如类 A 和B inherit from class C, class C and D inherit from class E) whereas in the real world your inheritance structures tend to be very flat (as in, classes A, B, C, and D all inherit from class E) Things are just这样做要简单得多。

希望这些指示对您有意义,如果没有,请问我一个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM