将未知对象发送到MVC中的RenderPartial

时间:2010-09-21 14:03:26

标签: c# asp.net-mvc renderpartial

这是我的renderparial

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<a href='<%= Url.Action("Edit", new {id=Model.ID}) %>'>
                    <img src="<%= Url.Content("~/img/pencil.png") %>" alt="Edit" width="16" /></a>

我基本上想以这种方式打电话:

<% Html.RenderPartial("edit", new { ID = item.hlpb_ID }); %>

然而,这给了我一个运行时错误'object' does not contain a definition for 'ID'

那么如何将一个动态创建的无名对象(因为我猜那是什么)发送到一个renderpartial?这适用于Url.Action

2 个答案:

答案 0 :(得分:1)

使用强类型视图时,您只能直接调用对象的成员。

如果要将动态对象传递给RenderPartial,您几乎不得使用反射或动态关键字来访问运行时不知道的属性。这样做是一种非常糟糕的做法。通常,您知道哪些对象传递给视图,因为您必须渲染它们。

有关如何使用动态关键字检查的详细信息,请访问:

http://weblogs.asp.net/shijuvarghese/archive/2010/02/03/asp-net-mvc-view-model-object-using-c-4-dynamic-and-expandoobject.aspx

答案 1 :(得分:1)

如果它总是您传入的ID,为什么不直接更新您的部分视图以接受Nullable<int>,例如

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %>
<a href='<%= Url.Action("Edit", new {id=Model}) %>'>
    <img src="<%= Url.Content("~/img/pencil.png") %>" alt="Edit" width="16" />
</a>

然后控制器中的Edit操作看起来像:

public ActionResult Edit(int? id)
{
    if (id.HasValue)
        // do something with id
    else
        // do something when no id supplied
}

如果它只是您感兴趣的ID,则尝试传入动态对象似乎毫无意义。如果您需要在对象中使用其他信息,则应考虑使用自定义ViewData类来填充而是转而进入View。