将参数传递给部分视图

时间:2016-08-17 21:01:45

标签: asp.net-mvc partial-views

我试图了解部分观点并且很难过。我有一个控制器,它有与之关联的标准视图(创建,编辑,...)和这些视图,除Index视图我想显示来自不同{{1 }}(表)。因为我认为我会创建一个局部视图的所有视图都是相同的事物和格式。但是我很难理解局部视图的实现。

对于修改创建删除详细信息视图,我正在显示{{1} }基于传递给视图的Model。我希望我的部分视图基于Device显示设备的相应位置。

我已从我的Model类DeviceID创建了一个 _Location 部分视图,其模板为详细信息。并试图通过一些不成功的方式传递参数。

如何将LocationID传递给局部视图?我是否将代码放入返回部分视图的LocationLocationID

部分视图如何知道它需要Controller?我已经查阅了教程但是我仍然很难。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

如果您在服务器端进行渲染,则视图(create.cshtml)会调用:

@Html.RenderPartial("_Location", Model)

RenderPartial有一个接受ViewModel的重载。

如果从客户端获取局部视图(例如通过ajax),请求将在控制器上执行操作,您可以返回部分:


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

如果你必须找到&#39; LocationID&#39;你会怎么做?通过&#39; DeviceID&#39;在另一个表格中搜索它为了将它传递给我的局部视图? 这里有3个选项:

AJAX通话 一个js脚本将在控制器上调用一个动作,该动作将从DB / Service获取数据并返回一个局部视图(一个用你更新DOM的html片段)

扩展ViewModel 您可以在ViewModel上添加一个包含位置数据的属性。以这种方式原始请求(创建完整视图的那个)。

从视图中调用服务 局部视图可以将locationID作为输入参数(请参阅上面的答案)并调用您的位置服务/仓库。示例 in _locationPartial.cshtml


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