【问题标题】:Model values not carrying into partial view from main view- C# MVC模型值未从主视图进入局部视图 - C# MVC
【发布时间】:2019-11-02 07:54:40
【问题描述】:

我已经被难住了好几天。

我有一个包含渲染部分视图的索引页面。视图模型从其控制器传递到索引页面,然后从 index.cshtml 内部传递到渲染部分视图作为扩展。 renderpartial 视图每 10 秒自动更新一次(通过 jquery 函数从索引页面到控制器)以更新其内容,效果很好。索引页面包含几个复选框,用于过滤掉渲染部分视图的内容。当时间段过去后调用初始渲染部分视图时会出现问题,渲染部分视图的控制器没有索引控制器先前具有的正确模型数据。当我们进入渲染部分视图时,模型中在索引控制器中设置为 true 的布尔值现在为 false。开始吧……

我的索引视图:

@model SelfServe_Test2.Models.NGTransCertViewModel

...        

    <div class="Services_StatusTable" id="refreshme">        
    @{            
        Html.RenderPartial("_Data", Model);
    }            
    </div>

...

@Html.CheckBoxFor(m => m.NGTransServicesModel.filter_NJDVSVR24, new { onclick = "test(id)" }) @Html.Label("NJDVSVR24", new { })

...

<script src="~/Scripts/jquery-1.12.4.js"></script>
<script type="text/javascript">
    $(function () {
        setInterval(function () { $('#refreshme').load('/NGTransCertServices/Data'); }, 10000); // every 10 seconds

    function test(filter) {
        alert(filter);
        var serviceChecked = document.getElementById(filter).checked;
        $.ajax({
            type: "POST",
            url: "/NGTransCertServices/ToggleVisibleService",
            data: { 'filterOnService': filter, 'serviceChecked': serviceChecked, 'model': @Model },
            //success: function (result) {
            //    if (result === "True")
            //        alert("yup");
            //    else
            //        alert("nope");
            //}
        });
    }

</script>

PartialView _Data.cshtml:

@model SelfServe_Test2.Models.NGTransCertViewModel

...

<table>
foreach (var item in Model.NGTransServicesList)
{

    if (Model.NGTransServicesModel.filter_EBT == true)
    {
        if (item.Description.Contains("EBT"))
        {

        }
    }
}
</table>

我的视图模型:

namespace SelfServe_Test2.Models
{
public class NGTransCertViewModel
{
    public NGTransCertViewModel()
    {
        NGTransServicesModel = new NGTransCertServicesModel();
        NGTransServicesList = new List<NGTransCertServicesList>();
        NGTransServices = new NGTransCertServices();
    }
    public NGTransCertServicesModel NGTransServicesModel { get; set; }
    public List<NGTransCertServicesList> NGTransServicesList { get; set; }
    public NGTransCertServices NGTransServices { get; set; }
}
}

控制器:

 public class NGTransCertServicesController : Controller
{
    NGTransCertViewModel NGT_VM = new NGTransCertViewModel();
    NGTransCertServicesModel certServicesModel = new NGTransCertServicesModel();

    public ActionResult Index()
    {            
        NGTransCertServices certServices = new NGTransCertServices();                        
        NGT_VM.NGTransServicesModel = certServices.InitServiceTypeCheckBoxes(certServicesModel);   // sets all checkboxes to true initially.
        return View(NGT_VM);
    }


    [OutputCache(NoStore = true, Location = System.Web.UI.OutputCacheLocation.Client, Duration = 10)]    // in seconds
    public ActionResult Data()
    {
        NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
        List<NGTransCertServicesList> List_certServices = certDBHandle.GetService();
        return PartialView("_Data", NGT_VM);
    }
}

最后是丢失值的模型:

 public class NGTransCertServicesModel
{
    ...
    public bool filter_NJDVSVR24 { get; set; }
    ...
}

现在,当调用 Index.cshtml 页面时,我运行将复选框值设置为 true 的 InitServiceTypeCheckBoxes 方法,将视图模型传递给索引页面并将相同的模型传递给渲染部分。在达到 10 秒超时并呈现 _Data.cshtml 之前,一切都很愉快。复选框的值现在都是 false。

让我添加一个视觉元素。下面是从控制器返回到索引视图时的模型,布尔值根据需要设置为 true。 (通过)

下面是索引视图时的模型

再次,在 _Data.cshtml 部分视图中

现在在控制器的 Data 操作中有一个断点,同样的 bool 值现在是 false

即使在 Data 操作中的第一行代码之前,布尔值也没有真正的值。

NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();

【问题讨论】:

  • Data 操作中,您传递了List&lt;NGTransCertServicesList&gt;,但部分视图期望SelfServe_Test2.Models.NGTransCertViewModel。它应该导致异常。
  • 无关,但除非您必须支持 IE 6-8,否则您应该真正尝试使用比 1.12 更现代的 JQuery 版本。
  • 谢谢,我确实需要使用更新的 JQuery 版本。我添加了一些视觉效果来帮助充实我的问题。

标签: c# asp.net-mvc model-view-controller model html.renderpartial


【解决方案1】:

我认为问题在于您没有在控制器的 Data 方法中正确填充视图模型。

在这两种方法中,您都将NGT_VM 属性发送到视图,但您只填充了Index 方法中的一些数据 - 默认情况下,当您调用@987654324 时,这些数据不会被持久化或创建@方法。

每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。在请求Data 的情况下创建控制器,NGT_VM 属性设置回默认NGTransCertViewModel 对象,默认NGTransCertServicesModel 对象(布尔属性filter_NJDVSVR24 将默认为@987654330 @)。然后,您创建并忽略变量 List_certServices,但您从未更新视图模型上的 NGTransServicesModel 属性以匹配您从 Index 方法获得的值。

您可能应该在填充 NGTransServicesList 变量后将其分配给 NGT_VM.NGTransServicesList

[OutputCache(NoStore = true, 
             Location = System.Web.UI.OutputCacheLocation.Client,
             Duration = 10)]
public ActionResult Data()
{
    NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
    List<NGTransCertServicesList> List_certServices = certDBHandle.GetService();
    NGT_VM.NGTransServicesList = List_certServices;
    return PartialView("_Data", NGT_VM);
}

您可以按照Data 方法中的要求调用相同的方法来更新NGTransServicesModel,但我不确定这是否真的是您所追求的行为?

【讨论】:

  • 我为这个问题添加了一些视觉支持。在执行 Data 操作中的第一行代码之前,该值会丢失。
  • @JasonBeck 如果最后一张照片是在您使用Data 方法时拍摄的,这是意料之中的——您只需在Index 方法中填充NGTransServicesModel。控制器中的属性不会在请求之间持续存在,这意味着您需要在每个方法中重新创建模型(或在任一方法之前调用的构造函数中重新创建它)。
  • 感谢您的意见。出于某种原因,我虽然它会持续存在,因为 'certServicesModel' 在方法之外,但它显然不是那样工作的。对于网站当前的工作方式,我认为娱乐是构造函数是最好的选择,感谢您的洞察!
  • 没有问题,很高兴能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多