gpt4 book ai didi

asp.net-mvc-4 - TempData 仅显示在子部分 View 中,而不显示在父部分 View 中

转载 作者:行者123 更新时间:2023-12-02 19:57:09 28 4
gpt4 key购买 nike

我正在 Umbraco 网页中创建一个 MVC 迷你应用程序。我在 Umbraco 用户论坛中提出了问题,但到目前为止还没有得到解决方案。

我的 Umbraco 6.1.6 站点有一个 webForms MasterPage。我的内容页面上有一个富文本编辑器,我在其中放置了一个宏。该宏加载一个宏部分 View ,如下所示:

<p><span style="color: red;">@TempData["CustomMessage"]</span></p>

@Html.Partial("~/Views/MacroPartials/Admin/Ethics/_Opinions.cshtml")
<br />
<input type="button" value="Add a New Opinion" class="btn btn-default" onclick="OpenCreatePopup()" />

<div id="opinionEditForm"></div>

@Html.Partial 加载 jQuery 记录网格。每个都有一个编辑按钮,可以触发以下 JavaScript 函数:

function editOpinion(id) {
var formDiv = $("#opinionEditForm");
formDiv.html();
formDiv.load("/umbraco/surface/OpinionsSurface/editOpinion/" + id, function () {
$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
bootstrapValidatorFix();
formDiv.dialog({
modal: true,
width: 830,
height: 800,
title: "Edit Ethics Opinion",
resizable: false
});
});
}

该函数命中 SurfaceController:

    // GET: OpinionsSusrface/editOpinion/5
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult editOpinion(int id)
{
Table<Opinion> opinions = db.GetTable<Opinion>();

var opinion = (from o in opinions
where o.opinionID == id
select new { opinionID = o.opinionID, opinionNumber = o.opinionNumber, title = o.title, opinionDate = o.opinionDate, summary = o.summary, bodyText = o.bodyText }).FirstOrDefault();

OpinionViewModel ovm = new OpinionViewModel();
ovm.opinionID = opinion.opinionID;
ovm.opinionNumber = opinion.opinionNumber;
ovm.title = opinion.title;
ovm.opinionDate = opinion.opinionDate.ToString("MM/yyyy");
ovm.summary = opinion.summary;
ovm.bodyText = opinion.bodyText;

ViewBag.Action = "Edit";
return PartialView("/Views/MacroPartials/Admin/Ethics/_OpinionEdit.cshtml", ovm);
}

创建一个编辑表单,前面的 javascript 将该表单注入(inject)到前面提到的 div 中,并将该 div 显示为模式对话框。我可以对表单进行更改,点击保存,表单将发回以下 Controller :

    // POST: OpinionsSurface/Edit/5
[HttpPost]
[NotChildAction]
[ValidateAntiForgeryToken]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult editOpinion(OpinionViewModel model)
{
if (!ModelState.IsValid)
{
return CurrentUmbracoPage();
}

Table<Opinion> opinions = db.GetTable<Opinion>();

Opinion opinion = opinions.Where(u => u.opinionID == model.opinionID).SingleOrDefault();

opinion.opinionNumber = model.opinionNumber;
opinion.title = model.title;
opinion.summary = HttpUtility.HtmlDecode(model.summary);
opinion.bodyText = HttpUtility.HtmlDecode(model.bodyText);
opinion.opinionDate = DateTime.Parse(model.opinionDate);
opinion.link = model.opinionNumber + ".pdf";

try
{
db.SubmitChanges();
}
catch (Exception ex)
{
}
TempData["CustomMessage"] = "Your form was successfully submitted at " + DateTime.Now;
return RedirectToUmbracoPage(2097);
}

记录被更新,页面刷新,我的 jQuery 网格显示更新的值。

永远不会发生的是传递到 TempData 的成功消息永远不会显示在第一个部分 View 上。

如果我放的话,这似乎是一个奇怪的副作用

<p><span style="color: red;">@TempData["CustomMessage"]</span></p>

在表单所在的部分 View 上,下次单击编辑记录时会显示 TempData!这向我证明TempData仍然有我的值(value),等待被使用。那么为什么它只显示在我的主分部 View 的子分部 View 上呢?为什么它不会显示在最低嵌套局部 View 之外的任何位置?

最佳答案

我最近在使用部分 View 宏将表单插入富文本编辑器时遇到了类似的问题。提交表单后,我发现我无法在部分 View 中访问 TempData,并且服务器端验证错误无法正常工作。但是,我可以在页面的 Index 操作方法和父 View 中访问此信息,因此宏部分似乎位于不同的 Controller 上下文中。

为了解决这个问题,我添加了一对操作过滤器属性,一个用于在 session 中存储 ModelStateTempData:

public class ExportModelStateToSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (!filterContext.Controller.ViewData.ModelState.IsValid)
{
HttpContext.Current.Session["ModelState"] = filterContext.Controller.ViewData.ModelState;
}

HttpContext.Current.Session["TempData"] = filterContext.Controller.TempData;
base.OnActionExecuted(filterContext);
}
}

另一个用于检索数据以在宏部分中使用:

public class ImportModelStateFromSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var modelState = HttpContext.Current.Session["ModelState"] as ModelStateDictionary;
var tempData = HttpContext.Current.Session["TempData"] as TempDataDictionary;

HttpContext.Current.Session.Remove("ModelState");
HttpContext.Current.Session.Remove("TempData");
if (modelState != null)
{
filterContext.Controller.ViewData.ModelState.Merge(modelState);
}

if (tempData != null)
{
foreach (var item in tempData)
{
filterContext.Controller.TempData[item.Key] = item.Value;
}
}

base.OnActionExecuted(filterContext);
}
}

根据您的情况,您需要将 [ImportModelStateFromSession] 属性添加到您的 GET 方法,并将 [ExportModelStateToSession] 属性添加到您的 POST 方法。

理想情况下,您不必在 session 中存储这些信息,但这是迄今为止我遇到的唯一可行的解​​决方案。

关于asp.net-mvc-4 - TempData 仅显示在子部分 View 中,而不显示在父部分 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28993031/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com