2012-07-12 27 views
0

在我的模型类中,我有一个布尔属性DoNotEmailMVC绑定复选框以反转其含义

在用户界面设计中,我已经创建了一个视图,复选框的含义是倒置的;即复选框旁边的标签表示"Send Email"

通常我会添加这样的复选框:@Html.CheckBoxFor(model => model.DoNotEmail)但显然这是错误的方式。

我是否需要为此复选框创建一个具有自定义属性的单独视图模型,或者有一些巧妙的方法可以执行此类操作:@Html.CheckBoxFor(model => !model.DoNotEmail)(显然不起作用)?

+0

是'DoNotEmail'从数据库中的字段?你的模型类是实体还是自定义模型? – James 2012-07-12 11:46:43

+0

是的,它是数据库中的一列,是的,模型类是一个实体。 – Andy 2012-07-12 11:52:07

回答

2

将实体直接传递给您的视图永远不是一个好主意,如果您的数据库模式发生变化,您将不得不通过所有视图并更新它们。我建议创建ViewModel并仅传递视图所需的数据,然后将DoNotEmail属性映射到控制器中。这样,您可以保持模型/视图之间的抽象,并保持您的视图简单,例如

public void ViewModel 
{ 
    [DisplayName("Send Email")] 
    public bool SendEmailNotification { get; set; } 
} 

查看

@model ViewModel 

@Html.CheckBoxFor(m => m.SendEmailNotifications) 

控制器

public void Post(ViewModel model) 
{ 
    var entity = ...; 
    entity.DoNotEmail = !model.SendEmailNotification; 
} 
+2

+1谢谢 - 我一直只使用ViewModels。看起来我应该一直在使用它们...... – Andy 2012-07-12 12:24:33

+0

@Andy我总是会推荐一个视图模型,给你一个干净的分离。如果您发现自己需要在很多地方创建视图模型,请查看[AutoMapper](http://automapper.codeplex.com/) – James 2012-07-12 12:29:20

+0

谢谢@James。 AutoMapper看起来很有用。 – Andy 2012-07-12 12:31:58

2

最简单的方式做到这一点可以叫到身边工作是:

让DontEmail一个隐藏的价值。 并创建一个复选框。将jquery事件绑定到它,并选择时,反转DontEmail的值。我希望我不需要在代码中解释这一点。如果需要的话让我知道。

+0

+1谢谢。我没有想过这样做。 – Andy 2012-07-12 12:24:57