模型值未从主视图进入局部视图 - C# MVC
Model values not carrying into partial view from main view- C# MVC
我被难住了好几天了。
我有一个包含 renderpartial 视图的索引页。视图模型从其控制器传递到索引页面,然后作为扩展从 index.cshtml 内部传递到 renderpartial 视图。 renderpartial 视图每 10 秒自动更新一次(通过 jquery 函数从索引页面到控制器)以更新其内容,效果很好。索引页面包含几个用于过滤掉渲染部分视图内容的复选框。当时间段过去时调用初始 renderpartial 视图时会出现问题,renderpartial 视图的控制器没有索引控制器之前具有的正确模型数据。当我们到达 renderpartial 视图时,在索引控制器中模型中设置为 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>
局部视图_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 部分视图中
现在在控制器的数据操作中有一个断点,相同的 bool 值现在为 false
即使在数据操作的第一行代码之前,布尔值也没有真正的值。
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
我认为问题在于您没有在控制器的 Data
方法中正确填充视图模型。
在这两种方法中,您都将 NGT_VM
属性 发送到视图,但您仅在 Index
方法中填充了一些数据 - 这些数据不会被保留或调用 Data
方法时默认创建。
每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。在请求 Data
创建控制器的情况下, NGT_VM
属性 设置回默认 NGTransCertViewModel
对象,默认 NGTransCertServicesModel
对象(布尔值 属性 filter_NJDVSVR24
将默认为 false
)。然后,您创建并忽略了一个变量 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
,但我不确定这是否真的是您想要的行为?
我被难住了好几天了。
我有一个包含 renderpartial 视图的索引页。视图模型从其控制器传递到索引页面,然后作为扩展从 index.cshtml 内部传递到 renderpartial 视图。 renderpartial 视图每 10 秒自动更新一次(通过 jquery 函数从索引页面到控制器)以更新其内容,效果很好。索引页面包含几个用于过滤掉渲染部分视图内容的复选框。当时间段过去时调用初始 renderpartial 视图时会出现问题,renderpartial 视图的控制器没有索引控制器之前具有的正确模型数据。当我们到达 renderpartial 视图时,在索引控制器中模型中设置为 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>
局部视图_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 部分视图中
现在在控制器的数据操作中有一个断点,相同的 bool 值现在为 false
即使在数据操作的第一行代码之前,布尔值也没有真正的值。
NGTransCertDBHandle certDBHandle = new NGTransCertDBHandle();
我认为问题在于您没有在控制器的 Data
方法中正确填充视图模型。
在这两种方法中,您都将 NGT_VM
属性 发送到视图,但您仅在 Index
方法中填充了一些数据 - 这些数据不会被保留或调用 Data
方法时默认创建。
每次请求命中控制器方法时,都会重新创建该控制器,并且只调用构造函数和请求的方法。在请求 Data
创建控制器的情况下, NGT_VM
属性 设置回默认 NGTransCertViewModel
对象,默认 NGTransCertServicesModel
对象(布尔值 属性 filter_NJDVSVR24
将默认为 false
)。然后,您创建并忽略了一个变量 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
,但我不确定这是否真的是您想要的行为?