带接口的ASP.NET MVC RegisterModel

时间:2012-09-06 22:02:47

标签: javascript asp.net-mvc asp.net-mvc-3

我想在我的网站的注册表中有一个界面。我们称之为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引擎无法解决它。

谢谢!

3 个答案:

答案 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

进行了相当详尽的讨论