2010-08-24 25 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

相關問題