【问题标题】:MVC 5 - Returning a set of objects to the page to renderMVC 5 - 将一组对象返回到要呈现的页面
【发布时间】:2015-04-12 14:53:17
【问题描述】:

我仍在学习 MVC 方式进行 Web 开发。

我有一个局部视图,可以呈现单张照片的信息(图片、用户名、光圈、其他信息)

我有几个页面要显示照片列表。例如,在我的主页上,我想显示要添加到网站的最新照片。

我目前的做法是,我在 PhotoController 中添加了一个 GetNewestPhotos() 函数,该函数会进入数据库以获取最新的照片记录,并且对于每条记录,渲染部分视图并将其连接到结果字符串(使用在这里找到的看起来很讨厌的RenderPartialViewToString)。然后在客户端,我通过 AJAX 请求这个字符串并用结果填充一个 div。

我几乎可以肯定这是错误的。我该怎么做?

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    在你的控制器方法中,返回一个局部视图并将你的复合对象注入到视图中

    public class CompoundType
    {
        public List<Photo> Photos { get; set; }
    }
    
    public ActionResult GetNewestPhotos()
    {
        CompoundType model = provider.GetPhotosFromDbAsCompoundObject();
        return PartialView("ViewName", model);
    }
    

    在您的视图中,指定您的视图模型应该是您的复合对象。

    @model CompoundType
    

    此时,只需遍历对象中的属性和/或集合即可将它们呈现为 html。

    @foreach (var photo in Model.Photos) 
    {
        @Html.Raw(photo.Name).
        ...
    }
    

    这比您当前的方法更可取的原因有很多。

    1. Razor 为您提供强大的打字功能。您可以查看您的类型是什么,并获得更多有用的运行时异常,让您更轻松地解决问题。

    2. 在您当前的范例中,您实际上是在做两次工作。您正在创建部分视图,但随后您正在获取它们并将它们拼接到客户端上。这是多余的工作。

    3. 可维护性。其他开发人员希望看到我概述的模式。通过保持一致,您将在网上找到更多有用的信息,并在遇到问题时能够更快地解决问题。此外,您可以通过更少的知识转移更轻松地移交您的项目。

    【讨论】:

      【解决方案2】:

      您有一个包含照片视图模型列表的页面的视图模型。此页面视图模型包含照片的视图模型列表。 在主页面调用的视图中:

      @Html.DisplayFor(m => m.PhotosView)
      

      这将使用您定义的默认视图呈现每个视图模型。

      编辑

      class MainPageController
      {
        ActionResult Index()
        {
         var model = new MainPageViewModel
         {
          Photos = GetListOfPhotoViewModelsOrderedByAge(SomeDataSource),  
        }
        return View(model)
      }
      
      class MainPageViewModel
      {
       // various other properties
       IList<PhotoViewModels> Photos {get; set;}
      }
      
      class PhotoViewModel
      {
       // properties to display about the photo (including hte path to the actual image)
      }
      

      Razor 视图(主页)

      @model MainPageViewModel
      @Html.DisplayFor(m =>m.Photos)
      @* other things on the page *@
      

      照片视图(在共享/显示目录中)

      @model PhotoViewModel
      <img url="@Model.PathToImage" />
      

      我还没有尝试过,这主要是我的想法,可能有轻微的语法错误。

      【讨论】:

      • 这要求我的主页使用照片模型,对吧?
      • @JohnShedletsky 是的,主页会有照片视图模型的列表。我会用一个更好解释的例子来更新我的答案。
      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2018-01-07
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多