[英]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.