2015-02-12 49 views
1

我仍在学习进行Web开发的MVC方式。MVC 5 - 将一组对象返回到页面进行渲染

我呈现的单张照片(图片,用户名,f值,其他信息)

我有我想要显示的照片列出几页信息的局部视图。例如,在我的主页上,我想显示要添加到网站的最新照片。

我目前的做法是,我已经添加了一个GetNewestPhotos()函数到我的PhotoController去数据库以获取最近的照片记录,并为每一个呈现partialview并将其连接到结果字符串(使用在这里找到的令人讨厌的RenderPartialViewToString)。然后在客户端,我通过AJAX请求这个字符串,并用结果填充一个div。

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

回答

2

在您的控制器的方法,返回一个局部视图,并注入您的化合物物体插入视图

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. 剃刀给你强大的打字。你可以看到你的类型是什么,你会得到更多有用的运行时异常,让你更容易排除故障。

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

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

0

您有包含照片查看模型列表的页面的查看模型。此页面视图模型包含照片的视图模型列表。 在查看主网页呼叫:

@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) 
} 

剃刀次(炫魅)

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

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

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

我还没有试过这并且它主要来自我的头顶,可能是轻微的语法错误。

+0

这需要我的主页使用照片模型,虽然,对吧? – 2015-02-12 02:12:06

+0

@JohnShedletsky是的主页面会有一个照片视图模型列表。我会用更好的解释示例更新我的答案。 – THBBFT 2015-02-12 02:19:26