2010-08-24 26 views
0

我喜欢用模型进行验证ASP.NET MVC:传递几个对象的视图,包括验证模型

<!-- ViewPage --> 

<%@ Page Language="C#" Inherits="ViewPage<TopicModel>" %> 

... 

<%= Html.TextBoxFor(m => m.Title) %> 

... 

<%= Html.TextBoxFor(m => m.Description) %> 


// Controller 

[HttpPost] 
public ActionResult NewTopic(TopicModel model) 
{ 
    // validate 
} 

它的伟大工程,但是当我需要通过额外的数据,我需要创建一个新的ViewModel类和我放松了灵活性。

<!-- ViewPage --> 

<%@ Page Language="C#" Inherits="ViewPage<TopicViewModel>" %> 

<%= Model.SomethingImportant %> 

... 

<%= Html.TextBoxFor(m => m.TopicModel.Title) %> // UGLY, I get name="TopicViewModel.TopicModel.Title" 

... 

<%= Html.TextBoxFor(m => m.TopicModel.Description) %> // UGLY, same thing 


// Controller 

[HttpPost] 
public ActionResult NewTopic(TopicViewModel model) 
{ 
    // validate 
    var validationModel = model.TopicModel; // UGLY 
} 

如何让它更容易和更好看?

+0

创建视图模型会失去什么灵活性?为什么你认为有'name =“TopicModel.Title”'丑陋? – 2010-08-24 07:34:50

回答

1

您是否考虑过使用ViewData词典来处理模型之外的额外数据?

更新或者,使您的视图模型成为您的模型的子类并添加额外的属性,但保留基类的验证。

+0

这意味着我将不得不投掷对象,这不是做ASP.NET MVC的好方法。 – Alex 2010-08-24 07:48:17

+0

然后,您可以使您的视图模型成为您的模型的一个子类,并添加额外的属性,但保留基类的验证。 – 2010-08-24 08:10:09

+0

谢谢!不是很好。很简单的解决方案(请更新您的评论,以便其他人可以看到这个问题是如何解决的。) – Alex 2010-08-24 09:12:22

1

你说的第二个例子,你说的看起来很丑,实际上比使用ViewData更好。

模型的思想是它包含视图在呈现时需要的“东西” - 所以它是放置视图所需的所有数据项的理想场所。

如果您真的被命名约定冒犯了(框架使用该约定来重新填充表单帖子中的模型),那么可以将该模型展平。这会给你每个项目“漂亮”的名字,但是无缘无故的工作很多。

+0

这是什么意思,“扁平化模型”? – Alex 2010-08-24 07:48:52

相关问题