在部分视图 MVC5 之间传递视图模型

Posted

技术标签:

【中文标题】在部分视图 MVC5 之间传递视图模型【英文标题】:Passing viewmodel between partial views MVC5 【发布时间】:2017-09-02 23:33:28 【问题描述】:

我有一个主视图和两个部分视图。我需要能够使用我的第一个局部视图中的值填充视图模型,并在单击按钮时将视图模型传递给第二个局部视图。该按钮位于第二个局部视图中。我已经编写了一个 javascript 函数来做到这一点,但是当我检查控制器方法时视图模型是空的。正如您在下面的屏幕截图中看到的,服务框是第二个局部视图

第一部分视图

第二部分视图

@model CC.GRP.MCRequest.ViewModels.NewRequestViewModel

<div id="NewRequest">
    <h1>Services</h1>

    @using (html.BeginForm())
    

        @Html.LabelFor(model => model.ProjectName, htmlAttributes: new  @class = "control-label col-md-5" )
        @Html.EditorFor(model => model.ProjectName, new  htmlAttributes = new  @class = "form-control", style = "width:100%"  )

        <input type="submit" value="Save" class="btn btn-default" onclick="mapInit()" />
    


</div>


<script type="text/javascript">

    function mapInit() 
        $.ajax(
            url: '@Url.Action("Service", "request")',
            // datatype: "json",
            data: $('form').serialize(), // update this
            type: "POST",
            // contentType: 'application/json; charset=utf-8'
        );
    


</script>

控制器

[HttpPost]
public PartialViewResult Service(NewRequestViewModel model)

    return PartialView("_NewService", model);

【问题讨论】:

发出 AJAX 请求是一个完全独立的请求-响应周期,完全脱离了初始视图呈现期间服务器端发生的情况。如果您需要那里的信息,您必须将其与 AJAX 请求一起发布或在那里重建。 对不起,克里斯。我没听懂你。能给我举个例子吗 我可以在控制器中看到视图模型值,但是在客户端,当我发出警报以检查它显示为空白的模型数据时 我注意到的另一件事是我的视图中没有任何称为表单的元素。你认为这是原因吗 你的表单元素应该被包裹在整个页面上,也就是视图本身,而不是单独在部分视图中。那是除非您的部分视图正在执行某种提交。此外,您可以在视图本身中设置模型,然后使用相同的模型向下渗透到每个部分视图中。 【参考方案1】:

这是我对您如何解决任务的建议:

    您必须将第二个局部视图表单上的按钮类型更改为按钮类型:&lt;input type="button" value="Save" class="btn btn-default" onclick="mapInit()" /&gt; 当原始提交事件在您的 ajax 方法之后发生时,此步骤是必要的,不要清理您的表单。李>

    在您的 mapInit 函数中,您应该添加一个属性 success 并在那里编写一个函数来手动更新您的第二部分表单:

    function mapInit() 
        $.ajax(
            url: '@Url.Action("Service", "request")',
            // datatype: "json",
            data: $('form').serialize(), // update this
            type: "POST",
            success: function (data)
            
                var html = $(data).find('form').html();
                $('#NewRequest').find('form').html(html);
            
        );
    
    

因此,只要您的第一个部分表单具有相同的字段,您就可以用您想要的内容填写第二个表单。

【讨论】:

【参考方案2】:

1) 为您的局部视图创建一个获取或发布操作。这将获取您发布的模型作为参数并返回第二个局部视图。

2) 修改UI部分视图的BeginForm字段,增加OnSuccess事件。(如Handel OnSuccess)

3) 创建 Jquery 方法以获取成功请求,并在 UI 中将第一个部分视图内容替换为第二个。(例如:$('#PartialView1Container').html(result);)

【讨论】:

以上是关于在部分视图 MVC5 之间传递视图模型的主要内容,如果未能解决你的问题,请参考以下文章

.NET MVC5简介

MVC5 视图:在模型中循环时设置并获取索引

两个视图模型之间的淘汰赛传递值

在 MVC 5 中,如何将表对象数据作为列表传递给控制器​​视图模型?

APS.NET MVC + EF (06)---模型

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]