0

我想在我的网站的注册表单中有一个界面。让我们称之为 IShape。有多种接口实现,如 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 引擎将无法解决它。

谢谢!

4

3 回答 3

1

您希望 MVC 框架如何建模绑定接口?为了使模型绑定起作用,MVC 必须知道它必须创建对象的哪个实例。界面中没有足够的信息来执行此操作,这意味着您将需要自定义模型绑定器。

您正在谈论的路径基本上覆盖了 MVC 为您提供的所有生产力特性,因为大多数 MVC 特性都基于约定优于配置。很难对接口进行约定。

我并不是说你不能这样做,但可能有更好的方法来解决它。

于 2012-09-06T22:09:38.583 回答
1

我会考虑在前端使用Knockout.js ,以允许用户构建他们的对象列表。它是一个 MVVM 框架,可让您管理客户端事件和操作 DOM。

您可以为他们添加的每个新形状(在 onclick 事件上)将 ajax 请求发送回服务器。然后,您需要保留用户在数据库或会话中建立的列表,但是当用户点击确认/提交时,您已经可以访问完整列表,因此可以轻松地一次对所有项目执行验证.

于 2012-09-06T22:14:31.550 回答
0

我想我有点理解,这很合理,但是使用接口不是解决问题的方法,因为接口永远不能被实例化,只有实现它的类可以。

我认为您需要做的是使用继承而不是接口。

您有一个基本的抽象 Shape 类,Circle、Square 等派生自该类。在输入表单上,您的用户可以愉快地选择 Circles 或 Squares,然后您将获得一个很好的统一 IList 类型的 Shape 以在您的控制器中处理。

为了做到这一点,您需要编写一个自定义模型绑定器,该绑定器检测到它正在尝试绑定一个抽象类(它不能这样做)并覆盖 CreateModel 以提供一个 Square 或 Circle 类型的新类(然后是类MVC 绑定到的)。

这里有关于这种技术的相当完整和详细的讨论

于 2012-09-06T22:52:32.827 回答