将参数传递给局部视图

问题描述 投票:0回答:2

我试图理解片面的观点,但遇到了困难。我有一个控制器,它具有与之关联的标准视图(创建、编辑等),并且在这些视图上,除了

Index
视图之外,我想显示来自不同
Model
(表).因为所有视图的内容和格式都是一样的,所以我想我会创建一个局部视图。但是我很难理解局部视图的实现。

对于 EditCreateDeleteDetails 视图,我基于传递给视图的

Device
显示
DeviceID
。我想让我的部分视图根据
LocationID
显示设备的相应位置。

我已经创建了一个 _Location 局部视图,它的模板是 Detail 来自我的

Location
模型类。并尝试通过多种不成功的方式将参数传递给它。

如何将

LocationID
传递给局部视图?我是否将代码放在返回局部视图的
Controller
LocationID
中?

分部视图如何知道它需要

LocationID
?我已经查阅了教程,但是我仍然很难过。

asp.net-mvc partial-views
2个回答
0
投票

如果您在服务器端呈现,视图 (create.cshtml) 将调用:

@Html.RenderPartial("_Location", Model)

RenderPartial 有一个接受 ViewModel 的重载。

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


    如果(请求。IsAjaxRequest){
        返回部分(“_Location”,vm);
    } 别的 {
        返回视图(“_Location”,虚拟机):
    }

如果您必须通过“DeviceID”在另一个表中搜索“LocationID”才能将其传递给我的部分视图,您会怎么做? 这里有 3 个选项:

AJAX 调用 一个 js 脚本将在控制器上调用一个操作,该操作将从数据库/服务中获取数据并返回一个部分视图(一个用于更新 DOM 的 html 片段)

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

从视图调用服务 部分视图可以获得 locationID 作为输入参数(请参阅上面的回答)并调用您的位置服务/回购。示例 in _locationPartial.cshtml:


    @model int //位置ID
    @{
        var repo = new My.App.Services.LocationService();
        var location = repo.GetLocation(模型);
    };
    @地点名称


-1
投票

最好创建一个可与编辑、创建、删除和详细信息视图一起使用的 ViewModel 类型,它包含要在主视图和部分视图中显示的所有信息。然后,您可以像我在 Details.cshtml 底部附近所做的那样使用

Html.Partial
来使用指定对象作为其模型来呈现局部视图。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.