首页 > 解决方案 > 另一个 TempData 在控制器操作之间消失的案例

问题描述

所以这是在控制器方法中设置 TempData 的另一种情况,使用 RedirectToAction 然后 TempData 消失了。但奇怪的是我有一个案例,它出于某种奇怪的原因确实有效。这是我的控制器方法:

[HttpGet]
public ActionResult Index()
{
    return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UploadXml(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null)
    {
        var fileExtension = Path.GetExtension(files.First().FileName).ToLower();
        string errors = string.Empty;

        switch (fileExtension)
        {
            case ".xml":
                var doc = XDocument.Load(files.First().InputStream);
                TextGetter.ImportXmlDocument(doc, out errors);
                break;
            case ".xlsx":
                TextGetter.ImportExcelDocument(files.First().InputStream, out errors);
                break;
            default:
                break;
        }

        if (!string.IsNullOrWhiteSpace(errors))
        {
            TempData["FileValidationErrors"] = errors;
        }
    }

    return RedirectToAction("Index");
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddMissingLanguages(FormCollection formCollection)
{
    try
    {
        TempData["NrOfLanguageNodesAdded"] = TextGetter.AddMissingLanguagesToNodes();
    }
    catch (Exception ex)
    {
        Logger.Error(MethodBase.GetCurrentMethod().Name, ex);
        Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
        return Json(TextGetter.GetText(Constant.ERROR, Constant.TEXT_GLOBAL) + ": " + ex.Message, System.Net.Mime.MediaTypeNames.Text.Plain, JsonRequestBehavior.AllowGet);
    }
    TempData.Keep("NrOfLanguageNodesAdded");
    return RedirectToAction("Index");
}

在我看来,这是我使用它们的方式:

@if (TempData.ContainsKey("FileValidationErrors") && !string.IsNullOrWhiteSpace(TempData["FileValidationErrors"].ToString()))
{
    <div class="row">
        <div class="col-12">
            <div class="alert alert-danger alert-dismissible fade show" role="alert">
                @TextGetter.GetText("XmlValidationFailedMessage", "setup/translation")Failed to validate the uploaded xml file with the following errors:<br />
                @TempData["FileValidationErrors"].ToString()
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
        </div>
    </div>
}
@if (TempData.ContainsKey("NrOfLanguageNodesAdded"))
{
    <div class="row">
        <div class="col-12">
            <div class="alert alert-success alert-dismissible fade show" role="alert">
                Number of missing nodes added:<br />
                @TempData["NrOfLanguageNodesAdded"].ToString()
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
        </div>
    </div>
}

所以这是奇怪的部分,当我调用方法“UploadXml”时,当我重定向到索引并且其中的消息显示在视图中时,TempData 确实存在。但是当我调用“AddMissingLanguages”时它不起作用,并且我尝试了很多事情,比如在各个阶段使用“.keep”和“.peek”等等,但无论我做什么,它都不适用于第二个控制器动作方法。

任何人都知道为什么会这样?

标签: c#asp.net.netasp.net-mvc

解决方案


推荐阅读