2008-11-17 50 views
0

简称:从视图如何modelbinding传球对象控制器?如何将未经修改的已修改对象从视图传回给没有表单的控制器?

长:
首先,基于通过搜索表单由用户给定的参数,某些对象从数据库中检索。 这些对象被赋予对客户可见(但未定义)的元数据(例如:对象的命名和定价因地区而异)。
稍后在该网站中,用户可以单击应显示这些对象的详细信息的链接。 因为这些元数据对于显示而言非常重要,但是不能定义,所以我需要将之前更改过的对象重新放回控制器中。 当我使用默认的asp.net mvc模型绑定时,使用.ToString()方法。这个关闭过程不会返回相关的字符串来重新创建完整的对象。
我会想到ISerializable接口会涉及,但事实并非如此。 我应该如何去达到预期的效果?我无法想象,我要面对这个问题,第一个,所以我想我失去了一些东西的地方......

回答

2

默认的模型绑定的名称将采用形式参数和性能匹配起来在参数列表中指定的类型。例如,您的模型具有属性“价格”和“名称”,那么表单需要包含带有ids /名称“价格”和“名称”的输入(我怀疑它会进行不区分大小写的匹配)。活页夹使用反射将与这些键相关联的表单值转换为适当的类型,并将其分配给由参数指定类型的新创建对象的属性(同样由反射派生)。

实际上,你可以看看(和下载)源出于此,在http://www.codeplex.com/aspnet,但你必须从那里深入到MVC源。我会给DefaultModelBinder源代码的一个链接,但是它们的构建方式,我相信链接会随着修订版的介绍而变化。

因此,要回答你的问题,你需要有参数(可以隐藏)表单对应于要重新创建对象的属性上。将表单(在视图中)发布到控制器时,活页夹应使用表单参数重新构建指定类型的对象。如果您需要从表单参数中的值转换为对象属性,那么您可能需要实现自己的自定义模型联编程序。

[编辑]在回答你的第二个帖子:

比方说,我们希望有一个链接回使用自定义对象的动作。我们可以使用特定的密钥将自定义对象存储在TempData中(或者如果我们需要它,则可以通过多次回发持续更多时间)。然后,我们可以构建操作链接并将该对象的关键字作为值提供给匿名类中的ActionLink。这将作为请求参数传回密钥。在我们的操作中,我们可以使用此参数中的键从TempData中检索对象。

<%= Html.ActionLink(ViewData["CustomObject1", 
        "Select", 
        new { TempDataKey = ViewData["CustomObject1_Key"] } 
        ) %> 
&nbsp; 

public ActionResult Select() 
{ 
    Entity custObj = null; 
    string objKey = Request.Params["TempDataKey"]; 
    if (!string.IsNullOrEmpty(objKey)) 
    { 
     custObj = (Entity)TempData[objKey]; 
    } 

    ... continue processing 
} 
+0

太棒了!这就像一个魅力!我正在研究如何让它看起来更简单一些,但现在它完美地起作用:) – 2008-11-18 08:26:53

0

@tvanfosson

谢谢你的解释,但怎么样的联系? (不涉及任何形式) 目前Html.ActionLink(c => c.Action(parameter),“label”)将对象作为参数。这些必须被翻译成URL部分。为此,MVC总是转到.ToString()方法。我不想在ToString方法中序列化我的对象。
不应该我能够以某种方式帮助框架序列化我的对象?通过ISerialize接口说什么?

+0

如果它不是一个小对象,那么你将无法在这种方式中传递完整的对象只要将它粘在会话中,或者可以传递对象的二进制序列化的base64编码字符串。但坚持它的地方会更好在我看来 – Sekhat 2008-11-17 14:50:11

相关问题