简短: modelbinding如何将对象从视图传递到控制器?

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

有帮助吗?

解决方案

默认模型绑定按名称获取表单参数,并将它们与参数列表中指定的类型的属性进行匹配。例如,您的模型具有属性<!> quot; Price <!> quot;和<!> quot; Name <!> quot ;,然后表单需要包含带有ids / names <!>的输入; Price <!> quot;和<!> quot; Name <!> quot; (我怀疑它是一个不区分大小写的匹配)。绑定器使用反射将与这些键关联的表单值转换为适当的类型,并将其分配给由参数指定的类型的新创建对象的属性(再次由反射派生)。

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

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

[编辑]回复你的第二篇文章:

假设我们希望链接回使用自定义对象的操作。我们可以使用特定键将自定义对象存储在TempData(或者如果我们需要它来通过多个回发来持续更新)中。然后,我们可以构造操作链接,并将对象的键作为值提供给匿名类中的ActionLink。这将把密钥作为Request参数传回。在我们的操作中,我们可以使用此参数中的键从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
}

其他提示

@tvanfosson

感谢您的解释,但链接呢? (不涉及任何形式) 目前,Html.ActionLink(c = <!> gt; c.Action(参数),<!> quot; label <!>“;)将对象作为参数。这些必须转换为URL部分。为此,MVC始终转到.ToString()方法。我不想在ToString方法中序列化我的对象。
我不应该以某种方式帮助框架序列化我的对象?通过ISerialize接口说什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top