2015-02-12 73 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