2012-04-27 91 views
-1

我有一个ViewModel,我想在后期自动绑定到另一个ViewModel。Mvc 3模型自动绑定

例如,如果我有

public class ViewModelA{ 
    public string Stuff {get;set;} 
} 

public class ViewModelB{ 
    public string MyStuff {get;set;} 
    . 
    . 
    . 
} 

显示器/渲染目的,我想部分绑定到ViewModelA,因为它是一个简单得多的对象,因此,它会希望是因为创建一个互动的观点更可重复使用的是一个代价沉重的命题。

但是,我需要之后的所有表格信息。我想我可以扩大控制器的行动,采取ViewModelA和ViewModelB,然后做额外的逻辑,以ViewModelA属性分配到ViewModelB,但是有更清晰,更具说明性的方式来做到这一点?

我想我知道如果我能标记ViewModelA,有一些像这样的属性:

[Bind(Prefix = "ViewModelB", Include = "MyStuff")] 

我知道我可以在行动层面做到这一点,但我可以在水平视图模型注入这个逻辑?

如果Razor遵循更多的CQRS方法,这也会很好。例如。

Html.TextBoxFor(target => target.Property, model => model.Property2) 

以便在渲染,文本框与Property2值初始化,但在后期,它发布到target.Property。

回答

0

难道你不能在ViewModelA继承ViewModelB吗?

public class ViewModelA : ViewModelB 
{ 
    public string Stuff {get;set;} 
    // etc. 
} 

public class ViewModelB 
{  
    public string MyStuff {get;set;} 
    // etc. 
} 

然后在你的控制器的方法,只需指定更宽ViewModelB和模型结合仍应映射的一切。

[HttpPost] 
public ActionResult(ViewModelB model) 
{ 
    // etc. 
} 
+0

我认为这将是一种解决问题的方法,但我一般都厌恶类继承和IsA关系。当有3个或更多的ViewModel,我想让他们中的2个去ViewModelB?或者,如果ViewModelA有一些不相关的“显示”属性呢?继承比他们的价值更令人头疼。我喜欢尽可能保持ViewModel POCO和松耦合。 – Alwyn 2012-04-27 17:24:29

+2

反馈类继承?为什么你甚至使用.NET? – cadrell0 2012-04-27 17:39:21

+1

@ cadrell0如何处理需要使用类继承映射到一个ViewModel的2种不同的视图模型?你如何保持目标ViewModel清洁不需要的属性?提示:你不能。 – Alwyn 2012-04-27 18:10:43

0

这将是更简单,如果你的两个模型具有相同的属性名的结合而言,无论你通过继承实现这一目标,或通过具有辅助性质,其业务是建立真正的属性名称。

这将更清楚地表明ViewModelB期望能够以不同的方式处理某些属性名称并使视图模板变得更加混乱。

0

只需指定ViewModelB作为处理表单帖子的操作的参数。

例如:

[HttpPost] 
public ActionResult Create(ViewModelB newWidget) { 
    // handle creation of widget... all information on the form pertaining to viewmodelB will be 
    // available in newWidget 
} 

不要紧,用什么模式来生成视图。只要表单字段名称与ViewModelB中的属性名称匹配,模型活页夹就会为您处理。