2011-09-20 60 views
2

我建立使用MVC阿賈克斯傭工一個Ajax形式:http://msdn.microsoft.com/en-us/library/dd505013.aspx從ViewData的MVC中HtmlHelpers擴展對象

的代碼類似於:

Ajax.BeginForm("ActionName", "ControllerName", 
    new { 
      SomeProperty = (ViewData["SomeObject"] as SomeClass).SomeProperty, 
      AnotherProperty = (ViewData["SomeObject"] as SomeClass).AnotherProperty, 
      AllTheProperties = (ViewData["SomeObject"] as SomeClass).AllTheProperties, 
      otherProperty= ViewData["otherObject"] 
     }, 
    new AjaxOptions {}, 
    new {id = "anHtmlId"}); 

,但有很多更多的屬性在ViewData["SomeObject"]雖然。

我想用盡可能少的線路儘可能增加ViewData["otherObject"]到的RouteData對象只是,不希望擁有所有的someObject奠定了獨立,這樣我可以將屬性添加到它的性能,而無需再重溫這段代碼風景。

實質上是「合併」這些對象,因爲routeData參數是有用的。


更新:一個想法:

Ajax.BeginForm("ActionName", "ControllerName", 
    ViewData["SomeObject"].addThePropertiesOf(ViewData["otherObject"]), 
    new AjaxOptions {}, 
    new {id = "anHtmlId"}); 

addThePropertiesOf()返回一個新的合併對象。我不想使用昂貴的反射鏡片,否則這看起來不算高效。

+0

聽起來有點像AutoMapper可能做的事情。 –

+0

Automapper看起來就像一把大錘放在指甲上,用來渲染視圖。 – StuperUser

+1

一方面,是的,另一方面也許'otherObject'是'someObject'的一個屬性,你只是想使用現有的庫來壓扁這個東西,並從'someObject'中取出你不想要的屬性。 –

回答

4

將某些值發送給HTML的不能被用戶修改的點是什麼?因爲它們不是作爲輸入元素的表單的一部分,只是作爲查詢字符串參數在回發中重新發送它們?沒有意義。這完全是浪費帶寬。對我來說,所有你需要發送到服務器時,您張貼這種形式是一些獨特的標識符(除當然所有的表單字段,用戶可以修改):

Ajax.BeginForm(
    "ActionName", 
    "ControllerName", 
    new { id = (ViewData["SomeObject"] as SomeClass).Id }, 
    new AjaxOptions { }, 
    new { id = "anHtmlId"} 
) 
{ 
    ... some input fields that the user can modify and 
     that will automatically be sent to the server when 
     the form is submitted 
} 

,當然還有所有的值是可以進行修改,您將擁有相應的輸入字段,其值顯然會自動發佈到服務器。

最後在服務器上使用此唯一標識符來重新獲取您在呈現表單時從GET操作中獲取它們的原始值。你從某個地方抓取了它們,對,否則你將無法將它們存儲在ViewData中。

請刪除那些ViewData/ViewBag,定義視圖模型並使用強類型視圖。我開始對那些不應該在任何ASP.NET MVC應用程序中使用的弱類型構造進行一些真正的過敏。

+0

儘管看起來不好的做法,但您提出的觀點有很多很好的理由,在不使用會話的情況下保留動態內容的多個狀態和RESTful請求。我同意你應該使用模型時,視圖中的對象。 – StuperUser

+0

@StuperUser,誰說會議的任何事情?我所說的是追加一個id並使用這個id從你的數據存儲(/數據庫或其他)中獲取值。根本沒有會話。我是Web應用程序中任何會話的偉大敵人。完全同意你使用會話不是RESTful。 –

+0

這些數據的使用方式(有些是Ids),每次從磁盤存儲/檢索它們,都會成爲使用數據庫保持狀態的Session模擬。'otherProperty'通常是相似的,所以擴展'SomeClass'可以返回一個新對象otherProperty和SomeClass的其餘部分。 – StuperUser