我试图理解片面的观点,但遇到了困难。我有一个控制器,它具有与之关联的标准视图(创建、编辑等),并且在这些视图上,除了
Index
视图之外,我想显示来自不同Model
(表).因为所有视图的内容和格式都是一样的,所以我想我会创建一个局部视图。但是我很难理解局部视图的实现。
对于 Edit、Create、Delete 和 Details 视图,我基于传递给视图的
Device
显示 DeviceID
。我想让我的部分视图根据LocationID
显示设备的相应位置。
我已经创建了一个 _Location 局部视图,它的模板是 Detail 来自我的
Location
模型类。并尝试通过多种不成功的方式将参数传递给它。
如何将
LocationID
传递给局部视图?我是否将代码放在返回局部视图的 Controller
和 LocationID
中?
分部视图如何知道它需要
LocationID
?我已经查阅了教程,但是我仍然很难过。
如果您在服务器端呈现,视图 (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(模型); }; @地点名称
最好创建一个可与编辑、创建、删除和详细信息视图一起使用的 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);
}