2011-09-20 45 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