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

时间:2015-05-29 06:13:20

标签: javascript c# asp.net-mvc asp.net-mvc-4 razor

这是控制器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'.

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

1 个答案:

答案 0 :(得分:2)

您只能将一个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; }
}

然后,只要您记得在操作中设置InitData,就可以在管理页面中重复使用AdminViewModel。