使用MVC在razor页面之间传递具有不同模型的变量

本文关键字:模型 变量 MVC razor 之间 使用 | 更新日期: 2023-09-27 17:51:02

这是控制器ActionResult所指向的视图:

@model MyDTO
@{
    ViewBag.Title = "RecoveryHome";
    Layout = "~/_AdminLayout.cshtml";
}
<script>
    var postPath = '@Url.Action("Upload", "Onsite")';
    var pageData =@Html.Raw(Json.Encode(Model))
</script>

其中MyDTO为pageData,在_AdminLayout中

@model MyOtherDTO
<html>
<head>
    <script type="text/javascript">       
        var InitData = @Html.Raw(Json.Encode(Model))         
    </script> 

MyOtherDTO用于InitData。

但是这返回一个异常:The model item passed into the dictionary is of type 'MyDTO', but this dictionary requires a model item of type 'MyOtherDTO'.

一个变量用于标题部分,其余变量用于页面的其余部分,因此将具有不同的模型。

使用MVC在razor页面之间传递具有不同模型的变量

您只能将一个viewmodel传递给视图,但这并不意味着您只能传递一个'DTO'。

最好不要混淆viewmodel和dto。

public class MyViewData
{
    public MyDTO PageData { get; set; }
    public MyOtherDTO InitData { get; set; }
}
然后

@model MyViewData
var pageData = @Html.Raw(Json.Encode(Model.PageData))

@model MyViewData
var InitData = @Html.Raw(Json.Encode(Model.InitData))

编辑:如果您使用布局的基类,您可能会发现这更容易管理,例如:

public abstract class AdminViewModel
{
    public MyOtherDTO InitData { get; set; }
}
public class PageViewModel : AdminViewModel
{
    public MyDTO PageData { get; set; }
}

那么你可以重用AdminViewModel跨你的管理页面,只要你记得设置InitData的动作。