2016-08-17 112 views
1

我想了解部分視圖並且很困難。我有一個控制器,它具有與之相關的標準視圖(創建,編輯...)和這些視圖,但Index視圖除外,我希望顯示來自不同Model(表格)的記錄。因爲對於所有的視圖來說,我認爲我會創建一個局部視圖。但是,我很難理解部分視圖的實現。將參數傳遞給部分視圖

對於編輯創建刪除,並詳細意見我基於傳遞給視圖的DeviceID顯示Device。我想讓我的部分視圖根據LocationID顯示設備的相應位置。

我已經創建了的詳細從我的模型類的Location模板的_Location局部視圖。並試圖通過參數傳遞一些不成功的方法。

如何將LocationID傳遞給局部視圖?我是否會將代碼放回Controller以返回部分視圖和LocationID

部分視圖如何知道它需要LocationID?我查過教程,但是我仍然很難。

回答

0

最好創建一個可用於編輯,創建,刪除和詳細信息視圖的ViewModel類型,該類型包含要在主視圖和局部視圖中顯示的所有信息。然後,您可以使用Html.Partial,就像我在這裏靠近Details.cshtml底部所做的那樣,將指定的對象作爲模型呈現您的局部視圖。

public class Device 
{ 
    public int DeviceID { get; set; } 
    public string Name { get; set; } 
    public int LocationID { get; set; } 
} 

public class Location 
{ 
    public int LocationID { get; set; } 
    public string Name { get; set; } 
    public int DeviceID { get; set; } 
} 

public class DeviceDetailsViewModel 
{ 
    public Device Device { get; set; } 
    public Location Location { get; set; } 
} 

Details.cshtml

@model TestAspNet.Models.DeviceDetailsViewModel 

@{ 
    ViewBag.Title = "Details"; 
} 

<h2>Details</h2> 

<div> 
    <span>Device: @Model.Device.DeviceID</span> 
</div> 
<div> 
    <span>@Model.Device.Name</span> 
</div> 
<div> 
    @Html.Partial("_Location", Model.Location) 
</div> 

_Location.cshtml

@model TestAspNet.Models.Location 

<span class="text-success">@Model.Name</span> 

DeviceController詳細方法

public ActionResult Details() 
{ 
    // Create a new instance of our ViewModel class. 
    var vm = new DeviceDetailsViewModel(); 

    // You would retrieve the Device and Location 
    // objects for the ViewModel object here. 
    vm.Device = new Device(); 
    vm.Device.DeviceID = 1; 
    vm.Device.LocationID = 2; 
    vm.Device.Name = "Device Name"; 

    vm.Location = new Location(); 
    vm.Location.DeviceID = 1; 
    vm.Location.LocationID = 2; 
    vm.Location.Name = "Location Name"; 

    // Pass your ViewModel in your return 
    // statement to set the model for the view. 
    return View(vm); 
} 
+0

因此,通過使用「詳細信息」模板它就像是在控制器的「詳細信息」? –

+0

我不確定你的意思。實際上,您可以使用「詳細信息」模板,因爲您希望根據自己的喜好修改模板,只需刪除一些樣板代碼即可讓網站啓動並運行。你不必使用它們。希望我的最新答案能夠幫助你明白我的意思。 – Zack

+0

它確實有助於答謝 –

0

如果站立着呈現在服務器側,視圖(create.cshtml)將調用:

@Html.RenderPartial("_Location", Model)

所述的RenderPartial具有接受一個ViewModel的過載。

如果取從客戶端(通過AJAX爲例)的局部視圖,請求將達到控制器上的動作,你可以返回部分:

 

    if (Request.IsAjaxRequest){ 
     return Partial("_Location", vm); 
    } else { 
     return View("_Location", vm): 
    } 

你會怎麼做,如果你必須通過'DeviceID'在另一個表中搜索'LocationID'才能將其傳遞到我的部分視圖? 這裏有3個選項:

AJAX調用 JS腳本會調用控制器上的作用,這將從DB /服務獲取數據並返回更新與DOM的局部視圖(一個HTML件)

擴展ViewModel 您可以在保存位置數據的ViewModel上添加一個屬性。以這種方式原始請求(創建的完整的視圖)。

呼叫從視圖 局部視圖的服務可以獲取locationID作爲輸入參數(見上面我的回答),並打電話給你的位置服務/回購。例如在_locationPartial.cshtml

 

    @model int //locationID 
    @{ 
     var repo = new My.App.Services.LocationService(); 
     var location = repo.GetLocation(Model); 
    }; 
    @location.Name 

+0

如果通過'DeviceID'在另一個表中搜索'LocationID'以將其傳遞給我的部分視圖,我該怎麼辦? –

+0

@EthelPatrick對我來說,當你構建ViewModel時,這將是你在控制器方法中需要做的事情。你有一個DeviceID,所以你使用它來查找LocationID,並且使用該LocationID來收集關於該位置的所有信息並創建一個「Location」對象(實體框架?)的實例。 – Zack

+0

感謝您的解釋 –