C# Mvc 3模型自动绑定

C# Mvc 3模型自动绑定,c#,.net,asp.net-mvc,asp.net-mvc-3,C#,.net,Asp.net Mvc,Asp.net Mvc 3,我有一个ViewModel,我想在post上自动绑定到另一个ViewModel 如果我有 public class ViewModelA{ public string Stuff {get;set;} } public class ViewModelB{ public string MyStuff {get;set;} . . . } 出于显示/渲染的目的,我希望partial绑定到ViewModelA,因为它是一个简单得多的对象,因此希望它能够更易于

我有一个ViewModel,我想在post上自动绑定到另一个ViewModel

如果我有

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

public class ViewModelB{
    public string MyStuff {get;set;}
    .
    .
    .
}
出于显示/渲染的目的,我希望partial绑定到ViewModelA,因为它是一个简单得多的对象,因此希望它能够更易于重用,因为创建交互式视图是一项成本高昂的任务

但是,我需要post上页面上的所有表单信息。我想我可以扩展控制器操作以同时使用ViewModelA和ViewModelB,然后执行额外的逻辑将ViewModelA属性分配到ViewModelB中,但是是否有更干净、更具声明性的方法来实现这一点

我想我想知道我是否可以标记ViewModelA,带有如下属性:

 [Bind(Prefix = "ViewModelB", Include = "MyStuff")]
我知道我可以在操作级别完成,但是我可以在ViewModel级别注入这种逻辑吗

如果Razor采用更多的CQRS方法也会很好。例如

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

因此,在渲染时,文本框用Property2值初始化,但在post时,它被发布到target.Property。

您不能在
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.
}

如果两个模型在绑定时具有相同的属性名称,那么就更简单了,无论是通过继承还是通过使用帮助器属性来实现这一点,帮助器属性的业务是设置不动产名称


这将更清楚地表明ViewModelB希望能够以不同的方式处理某些属性名称,并减少视图模板的混乱程度。

只需将
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中的属性名匹配,模型绑定器就会为您处理它。

我认为这是解决这个问题的一种方法,但我通常不喜欢类继承和IsA关系。还有,如果有3个或更多ViewModel,并且我希望其中2个转到ViewModelB,会发生什么情况?或者如果ViewModelA有一些不相关的“显示”属性呢?继承比他们的价值更令人头痛。我喜欢尽可能保持ViewModel POCO和松散耦合。讨厌类继承吗?为什么要使用.NET?@cadrell0如何处理需要映射到一个具有类继承的ViewModel中的两个不同视图模型?如何保持目标ViewModel不受不必要属性的影响?提示:你不能。@Alwyn:你不能将评论标记为离题。和“重组合轻继承”!=“遗产是邪恶的”。请尽量保持你的评论礼貌。@Will WTF的目的是:“你为什么还要使用.NET?”