我想在我的网站的注册表中有一个界面。我们称之为IShape。 有一些serval接口实现,比如ISquare和ICycle, 除了在接口中声明的共享属性外,每个属性都有自己的属性。
我希望用户能够拥有他想要的所有类型的形状, 并能够填写他们作为RegisterModel收到的信息。
public class RegisterModel
{
[Required]
[Display(Name = "Username")]
public string UserName { get; set; }
[Required]
[Display(Name = "Shapes")]
public List<string> Shapes { get; set; }
}
注册行动:
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Iterate over the shapes
model.Shapes ...
}
}
请参阅javascript问题,因为如果我有多个对象,他们的名字就会发生冲突。 例如:2个形状具有size属性。如果我创建两个名为“size”的文本框, ASP.NET引擎无法解决它。
谢谢!
答案 0 :(得分:1)
您希望MVC框架如何建模绑定接口?为了使模型绑定起作用,MVC必须知道它必须创建的对象的实例。界面中没有足够的信息来执行此操作,这意味着您将需要自定义模型绑定器。
您正在谈论的是一条基本上覆盖了MVC为您提供开箱即用的所有生产力功能的路径,因为大多数MVC功能都基于约定优于配置。很难有接口约定。
我不是说你不能这样做,但可能有更好的方法去做。
答案 1 :(得分:1)
我会考虑使用Knockout.js作为前端,以允许用户构建他们的对象列表。它是一个MVVM框架,允许您管理客户端事件并操纵DOM。
您可以为他们添加的每个新形状(在onclick事件上)向服务器发送ajax请求。然后,您需要保留用户在数据库或会话中构建的列表,但是当用户点击确认/提交时,您已经可以访问完整列表,因此可以轻松地立即对所有项目执行验证
答案 2 :(得分:0)
我认为我有点理解并且这是非常合理的但是使用Interfaces并不是解决这个问题的方法因为接口永远不会被实例化,只有实现它的类才可以。
我认为你需要做的是使用继承而不是接口。
你有一个基本的抽象Shape类,Circle,Square等派生自。在输入表单上,您的用户可以愉快地选择Circles或Squares,然后您可以在控制器中获得一个很好的统一的Shape类型的IList。
为了做到这一点,你需要编写一个自定义模型绑定器,它检测到它正在尝试绑定一个抽象类(它不能做)并覆盖CreateModel以提供一个新类型Square或Circle(这是然后是MVC绑定的类。)
对此技术here
进行了相当详尽的讨论