【问题标题】:RazorView, use same model object for more than one templateRazorView,对多个模板使用相同的模型对象
【发布时间】:2014-01-14 16:27:33
【问题描述】:

我在尝试使用同一个对象渲染两个单独的模板时遇到问题。

我有一些看起来像这样的东西:

@Html.DisplayFor(m => Model, "TemplateOne")
@Html.DisplayFor(m => Model, "TemplateTwo")

第一个模板得到渲染,第二个不会。

我使用 .NET Reflector 单步执行代码以查看发生了什么并发现:

if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(item))
{
     return string.Empty;
}

TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string templateName, DataBoundControlMode mode, object additionalViewData, ExecuteTemplateDelegate executeTemplate)

因此,它会检查模型/对象是否已用于渲染模板,如果在我的示例中具有,则返回“”,因此不会显示第二个模板。

我有一个解决方法是克隆第二个模板的模型,但我想知道是否还有其他我可以做的事情,比如我可以设置的配置选项?

史蒂夫

【问题讨论】:

  • 一定是你做错了什么,因为我无法重现这个问题。从您的视图和显示模板中发布更多代码,也许会有所帮助。
  • 我也无法重现这个(尝试使用 MVC 3、4 和 5)。但是,我注意到的一个问题是,有时在使用 VS2013 和 MVC 5 构建之后,显然会缺少一个模板。实际上,我必须修改调用模板的视图,保存并重建它才能正常工作。似乎是断断续续的,很可能是一个错误。
  • 我会看看我是否可以在一个新项目中得到同样的东西,如果我要将同一模型上的另一个属性传递给它工作的模板之一。我会及时通知你
  • 好的,我可以在一个干净的解决方案中重现这个。这是一个带有新 Web 项目的 zip 和一个示例:dl.dropboxusercontent.com/u/18857420/WebApplication1.zip 浏览到 /Help/ 我已经修改了表格以显示两个额外的列(模板一和二)。 (ApiGroup.cshtml) 对于模板一,它只是将用于渲染其视图的相同模型发送到模板,对于模板二,它使用有效的控制器描述符属性。如果您启动它,您将看到模板的一列将是空的,因为该模型已经用于渲染 ApiGroup.cshtml。希望有意义
  • 我现在的解决方法是:为每个模板创建一个包装模型,但这太疯狂了……这里一定有什么问题吗?

标签: c# asp.net-mvc razor model


【解决方案1】:

现在对我来说解决这个问题的方法是创建

public class ModelWrapper{

      public object Model { get; set}
}

并将此设置传递给我实际需要的模型。

不幸的限制

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多