模型值未从主视图带入局部视图-C#MVC
我已经被难倒好几天了 我有一个包含renderpartial视图的索引页。viewmodel从其控制器传递到索引页,然后作为扩展从index.cshtml内部传递到renderpartial视图。renderpartial视图每10秒自动更新一次(通过jquery函数从索引页向控制器发送),以更新其内容,这很好。索引页面包含多个复选框,用于过滤renderpartial视图的内容。如果在时间段已过时调用初始renderpartial视图,则会出现问题,renderpartial视图的控制器没有索引控制器之前拥有的正确模型数据。当我们进入renderpartial视图时,模型中的布尔值在index controller中设置为true,现在为false。让我们开始 我的索引视图:模型值未从主视图带入局部视图-C#MVC,c#,asp.net-mvc,model-view-controller,model,html.renderpartial,C#,Asp.net Mvc,Model View Controller,Model,Html.renderpartial,我已经被难倒好几天了 我有一个包含renderpartial视图的索引页。viewmodel从其控制器传递到索引页,然后作为扩展从index.cshtml内部传递到renderpartial视图。renderpartial视图每10秒自动更新一次(通过jquery函数从索引页向控制器发送),以更新其内容,这很好。索引页面包含多个复选框,用于过滤renderpartial视图的内容。如果在时间段已过时调用初始renderpartial视图,则会出现问题,renderpartial视图的控制器没有索
@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>
现在,当调用Index.cshtml页面时,我运行initServiceTypeCheckBox方法,将复选框值设置为true,将viewmodel传递给Index页面,并将相同的模型传递给renderpartial。在达到10秒超时并呈现_Data.cshtml之前,所有人都很高兴。复选框值现在全部为false
让我添加一个视觉元素。下面是从控制器返回到索引视图时的模型,布尔值根据需要设置为true。(逐步通过)
下面是当索引视图
同样,在_Data.cshtml部分视图中
现在控制器中的数据操作中有一个断点,该bool值现在为false
即使在数据操作的第一行代码之前,bool也没有真值
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
我认为问题在于您没有在控制器的
Data
方法中正确填充视图模型
在这两种方法中,您都将NGT_VM
属性发送到视图,但您仅填充Index
方法中的一些数据-在调用data
方法时,默认情况下不会保存或创建这些数据
每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。在请求创建控制器时,NGT\u VM
属性被设置回默认的NGTransCertViewModel
对象,带有默认的NGTransCertServicesModel
对象(布尔属性filter\u NJDVSVR24
将默认为false
)。然后创建并忽略变量List\u 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);
}
[OutputCache(NoStore=true,
Location=System.Web.UI.OutputCacheLocation.Client,
持续时间=10)]
公共行动结果数据()
{
NGTransCertDBHandle certDBHandle=新的NGTransCertDBHandle();
List_certServices=certDBHandle.GetService();
NGT_VM.NGTransServicesList=列表服务;
返回PartialView(“_数据”,NGT_虚拟机);
}
您可以调用相同的方法来更新
NGTransServicesModel
方法中所需的Data
方法,但我不确定您在传递列表的Data
操作中所追求的行为是什么?,但部分视图预期selfservice\u Test2.Models.NGTransCertViewModel
。这应该会导致一个异常。不相关,但除非您必须支持IE6-8,否则您应该尝试使用比1.12更现代的JQuery版本。谢谢,我确实需要使用更新的JQuery版本。我添加了一些视觉效果以帮助充实我的问题。我添加了一些对问题的视觉支持。在执行数据操作中的第一行代码之前,该值丢失。@JasonBeck如果在使用Data
方法时拍摄了最后一张照片,这是预期的-您仅在Index
方法中填充NGTransServicesModel
。控制器中的属性在请求之间不会持久,这意味着您需要在每个方法中重新创建模型(或者在任何方法之前调用的构造函数中重新创建模型)。感谢您的输入。出于某种原因,我认为它会一直存在,因为“certServicesModel”在方法之外,但它显然不起作用。对于网站目前的工作方式,我认为娱乐是一个建设者是最好的选择,谢谢你的洞察力!没问题,很高兴能帮上忙:)
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; }
...
}
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
[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);
}