【问题标题】:Where should be C# based Code placed in the MVC View?基于 C# 的代码应该放在 MVC 视图中的什么位置?
【发布时间】:2017-11-23 17:49:21
【问题描述】:

我目前正在从事基于 MVC 5 的项目。现在为了从数据库中检索少量文本内容,我已经调用 API 来获取要在视图中使用的文本。这里我的视图是一个基本简单的表单,其中很少有文本来自数据库。

现在在加载页面时,我发现在加载页面时最初没有加载图像。我使用 API 调用从数据库中获取图像路径,其中存储了缓存中的特定数据列表。

现在我不确定应该在哪里调用 API。我创建了通用函数来调用 API 以检索数据。

我必须选择选择

1) 将调用直接放在我的图像标签内的 Src 属性中

<img src="@myfunctioncall" style="max-height:50px;" />

2) 在视图顶部的 C# 块内,我应该声明变量,然后调用 API,然后在我的图像标签内的 Src 属性中使用该变量。

在视图之上

@{
string myVal = myfunctioncall;
}

然后在我的 img 标签中使用 myVal

.........Code......
<img src="@myVal" style="max-height:50px;" />
.........Code......

我不确定页面的呈现方式以及完成工作的最佳方法。

【问题讨论】:

  • 它不应该出现在您的视图中。对方法的调用应该在控制器中(您可以在其中进行测试),并且您将模型传递给包含该调用结果的视图。
  • View 不是为处理代码逻辑而设计的,逻辑任务应该由控制器动作方法来处理。你可以利用 viewmodel 来做到这一点。

标签: c# asp.net-mvc asp.net-mvc-4 view


【解决方案1】:

在控制器中,您必须编写代码以从数据库中检索数据,然后创建一个视图 Bag 为 ViewBag.Path= imagePath;,其中 imagePath 是 C# 字符串变量,其中包含从数据库检索的路径值。然后在 View 中你可以使用 ViewBag 作为&lt;img src="@ViewBag.Path" style="max-height:50px;" /&gt;

【讨论】:

    【解决方案2】:

    正确的做法是:

    1) 建立模型:

    public class MyModel
    {
         public string ImagePath {get;set;}
         //other properties
    }
    

    2) 控制器:

    public class MyController:Controller
    {
        public ActionResult Index()
        {
           MyModel model = new MyModel();
           model.ImagePath = //here get it from service
           return View(model);
        }
    }
    

    3) 视图:

    <img src="@Model.ImagePath" style="max-height:50px;" />
    

    在View的第一行需要添加:

    @model MyModel
    

    另一个(不建议的)选项是:

    ViewBag 不是强类型,因为它的类型是dynamic,这意味着拼写错误等错误不会在构建过程中被捕获,而是在运行时中。

    控制器:

    public class MyController:Controller
    {
        public ActionResult Index()
        {
           ViewBag.ImagePath = //your service call
           return View();
        }
    }
    

    查看:

    <img src="@ViewBag.ImagePath" style="max-height:50px;" />
    

    View 中进行服务调用的想法违反了MVC 模式,其中View 应该尽可能愚蠢。 它只是表示层。

    【讨论】:

    • 我非常了解这种方法。我的观点的问题是它在很多地方都被共享,我无法将新属性添加到我当前传递给查看的模块中,因为模型已经加载了我的属性,尽管我知道没有相同的限制。您提到 ViewData 的另一种方法,但我个人不喜欢它。
    • 如果您创建一个 ViewModel,它将添加您需要的内容并将 Model 保留为属性。它可能是通用的。示例:public T Model {get;set;} 和 public string ImagePath {get;set;} 并使用它?
    【解决方案3】:

    最好的方法是在你的控制器中进行所有操作,然后将一个对象作为模型传递给你的视图。

    在您看来,您可以使用您的模型来填写您的字段。

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2010-09-23
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多