【问题标题】:Creating partial view with dynamic content使用动态内容创建局部视图
【发布时间】:2014-09-08 14:38:40
【问题描述】:

我明白当我创建一个视图时,除了 html 和来自模型/控制器的数据之外,我不应该在其中放置任何代码,这是我迄今为止所做的。

但是假设有一段动态生成的 html 可以在多个视图中使用,我猜这将是项目中 Shared 文件夹中的部分视图。但由于它是一个局部视图,它没有绝对控制器来处理它的动态数据传播(来自 db),我将如何调用,以及我将在哪里将数据从 db 传播到视图(或模型?),如果假设部分视图是为table.id=n 等动态呈现内容。

我是新手,正在编写 .net 中的教程,试图弄清楚如何做到这一点。有谁知道它是怎么做的?希望这个问题有意义。

【问题讨论】:

  • 您可以将模型传递给局部模型,因此它与您在视图中的方式没有什么不同。
  • 我在哪里传播该模型,没有控制器来传播数据库中的数据
  • 来自为您的视图创建模型的控制器。
  • 好吧,假设有 10 个不同的控制器/模型使用自己的视图,但也使用这个局部视图...然后我会进入 10 个控制器中的每一个并传播模型,这将在局部视图中使用,这是有道理的,但这不会成为冗余编码,即:在所有 10 个控制器中重写传播代码?
  • 每个模型都可以有一个属性,该属性是控制局部视图的模型。所以你只是在制作一个新模型。然后创建一个函数来填充该模型。是的,您需要在每个控制器中填充该模型,但这只是一个函数调用,无论如何您都必须填充模型。

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

您始终可以为局部定义模型。

您可以从容器视图中渲染部分视图,并传递其模型的动态填充实例:

<!-- index.cshtml -->
<h1>Feed Upload</h1>
<div id="uploader">
        @Html.Partial("~/Views/Shared/Controls/_FileUploader.cshtml", new FileUploaderModel() { UploaderClassName = this.Model.UploaderClassName })
</div>

在这个简单的示例中,我使用 @Html.Partial() 方法从 index.cshtml 调用部分 _FileUploader.cshtml,并传递一个指定 UploaderClassName 值的新模型实例。

编辑

this.Model.UploaderClassName 指的是 container 的模型,它是在 container 的控制器业务中初始化的。当然 container 的控制器可以运行任何数据访问逻辑来从 db 中获取动态数据并将它们传递给 partial 的模型。

看看MSDNthis article

【讨论】:

  • 所以你正在从数据库中传播模型数据,在模型本身中不使用任何控制器?
【解决方案2】:

假设您使用的是 razor 视图引擎,您可以将 .cshtml 文件放入带有帮助函数的 App_Code 文件夹中。

语法是这样的:

@helper FormatDate(DateTime date)
{
    @date.ToShortDateString()
}

你这样称呼它(假设文件是​​ Utility.cshtml)

@Utility.FormatDate(Patient.DOB)

因为您可以将参数传递给帮助程序,所以您可以传递您需要的任何类型,包括复杂的对象。

【讨论】:

  • 是的,我正在使用剃须刀,但我没有 App_Code 文件夹,但是我有,看到 App_Data 文件夹当前为空,是吗?
  • 然后创建一个 App_Code 文件夹。
  • 嗯,好的。所以你提供的这个例子是局部视图还是别的什么?
  • 是个帮手。您可以将 HTML 放入其中。您不仅限于 C#。
  • 我假设助手与局部视图不同,我所要求的确实不能在局部视图中完成,必须通过助手完成?
【解决方案3】:

我最近发布了一个 nuget 包来做这件事。它被称为动态MVC。

http://dynamicmvc.com

您可以在 codeplex 上查看源代码。

https://dynamicmvc.codeplex.com

我这样做的方法是使用 MVC 中内置的 ModelMetadata 引擎,以允许我以弱类型的方式获取任何属性的值。 ModelMetadata 引擎最初来自 ASP.net Dynamic Data,并在 MVC2 中移植到 MVC。它非常适合这种情况。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多