0

简短:模型绑定如何将对象从视图传递到控制器?

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

4

2 回答 2

2

默认模型绑定按名称获取表单参数,并将它们与参数列表中指定的类型的属性匹配。例如,您的模型具有属性“价格”和“名称”,那么表单需要包含带有 ids/名称“价格”和“名称”的输入(我怀疑它不区分大小写匹配)。绑定器使用反射将与这些键关联的表单值转换为适当的类型,并将其分配给参数指定类型的新创建对象的属性(再次通过反射派生)。

您实际上可以在http://www.codeplex.com/aspnet查看(并下载)源代码,尽管您必须从那里深入了解 MVC 源代码。我会提供一个指向 DefaultModelBinder 源的链接,但是它们的构造方式,我相信链接会随着修订的引入而改变。

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

[编辑] 回应您的第二篇文章:

假设我们想要一个链接返回到使用自定义对象的操作。我们可以使用特定的键将自定义对象存储在 TempData(或 Session,如果我们需要它通过多个回发持续更长时间)。然后我们可以构造动作链接并将对象的键作为值提供给匿名类中的 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
}
于 2008-11-17T12:35:42.230 回答
0

@tvanfosson

感谢您的解释,但是链接呢?(不涉及表单)目前 Html.ActionLink(c=>c.Action(parameter), "label") 将对象作为参数。这些必须被翻译成 URL 部分。为此,MVC 总是使用 .ToString() 方法。我不想在 ToString 方法中序列化我的对象。
我不应该能够以某种方式帮助框架序列化我的对象吗?说通过ISerialize接口什么的?

于 2008-11-17T14:44:11.567 回答