0

你好朋友...

我有一个 mvc 项目和一个带有附件框的表单(例如 yahoo mail compose)

例如“create_request.cshtml”


我想:

每个用户填写字段并上传他/她的文件(当用户选择任何一个时,我通过 Ajax 发布每个文件)并在提交表单后,如果页面有错误(检查服务器端),用户会在响应中看到上传的文件页面(带有突出显示的错误的响应表单)...


我很好地实现了上述场景:

(Ajax+ Tempdata+ 提交前保存文件服务器端+ 提交表单前上传文件的拇指)

在我的控制器中:

 public void KeepTempData(string name, string value)
    {
        TempData[name] = value;
    }

在我看来,我通过另一个 ajax 代码上传每个文件名后将其发送到服务器:

ajaxPostData(KeepTempData, "Attachments", $('#Attachments').val());

但我有一个问题:

因为我使用TempData来保存上传的文件名列表,所以如果用户在当前页面中附加一个文件,然后在她/他的浏览器中打开一个新选项卡并转到“create_request”页面地址。他/她看到一个带有附件的空表格...

我的解决方案:

也许我可以使用每个页面(每个表单)的唯一键来解决这个问题,并将其保存在会话变量和每个页面请求的隐藏字段中>>使用:“Anti Forgery Token with a Salt”“DateTime.Now”

我在网上找到了这篇文章。它的问题就像我的问题一样。它的解决方案就像我的解决方案一样。


MVC 中针对此问题的适当解决方案是什么???

当用户在浏览器的某些选项卡(如 firfox)中有不同的页面请求时,您对使用 TempData(或 Session)没有任何冲突的建议是什么?

4

2 回答 2

0

TempData 的生命周期很短。您应该使用 Session 而不是 TempData。

Infact 会话对象是 TempData 背后的后备存储。但是 TempData 中存储的数据对当前请求和后续请求都是可用的。

于 2013-03-23T22:46:48.317 回答
0

我通过以下方式解决了这个问题:

  • 从查询字符串中获取密钥
  • 如果密钥为空
    • 我在控制器的操作中生成了一个新的唯一键
    • 使用键将页面重定向到新 url(作为查询字符串键值)
  • 别的
    • 将密钥添加到 ViewBag(用于在视图中设置隐藏字段)
    • 将密钥保存在会话变量中。

.

public virtual ActionResult Create(string attkey)
{
     if (string.IsNullOrEmpty(attkey))
     {
         attkey = generatNewNameForSession('key'); // for examle: kye_jhtyujbvkjadsgfvn
         Response.Redirect("myControle/Create, attkey="+attkey), true);
        }
        ViewBag.AttachmentsKey = attkey;
        if (Session[attkey] == null)
            KeepData(attkey, "");
        .
        .
        .

现在我的页面的每个实例都有一个标识,现在我可以决定显示或不显示以前附加的文件。

于 2013-04-16T15:17:05.687 回答