首页 文章

在MVC中的视图之间传递数据

提问于
浏览
0

我正在使用C#和MVC开发Web应用程序项目,该项目将在表单中接收两个URL并使用它们来创建我创建的名为“ImageSwap”的类的实例 . 这个模型有一些数据(执行交换的人的用户名;两个变量,用于保存要交换的两个图像的URL;两个变量,用于保存这些文件的实际名称,而不包含所有其余的URL信息;以及两个表示检查这些文件的文件位置的数组 . 现在,我拥有它,以便初始索引视图创建类的实例,并将其传递到同一视图,其中包含通过表单输入的信息,通过POST提交,如下所示:

public ActionResult Index()
{
Ops.Operations.Models.ImageSwapModel newImageSwap = new Models.ImageSwapModel();
return View(newImageSwap);
}

[HttpPost]
    public ActionResult Index(ImageSwapModel imageSwap)
    {
        var oldFileFound = false;
        var newFileFound = false;

        if (ModelState.IsValid)
        {
        //Perform data manipulation and set needed values
        }
     }

然后它对数据执行一些功能,例如解析URL末尾的文件名和目录号(这是该文件名的第一部分,即目录#_fileName.jpg) . 所有这一切都很好 .

我的问题是,我希望将此模型传递到另一个视图,一旦它在所有字段中填充了这个初始ActionResult的数据,这样我就可以有一个验证视图,这将允许用户并排预览这两个文件这样他们就可以确保他们交换适当的图像 . 然后,他们应该能够点击另一个提交按钮,该按钮将启动图像的实际移动/替换并被带到页面确认 .

有没有办法将数据从此控制器传递到另一个视图?我的困惑之所以产生,是因为我无法使用相同的输入创建另一个版本的IndexR的ActionResult,但我不希望在没有预览和提示的情况下进行实际的图像交换 . 我应该重新编写我的索引视图,以便它使用部分视图来完成此操作吗?通过多个步骤和视图保持数据的最简单方法是什么?

2 回答

  • 3

    通过多个步骤和视图保持数据的最简单方法是什么?

    您的问题听起来像是在尝试实现您可以通过会话轻松完成的任务 . 会话对象允许您在请求之间保留数据,只需将其添加到控制器扩展的基类中存在的 HttpContext 上的 Session 对象,如下所示:

    (注意Serializable属性 . 这允许将对象序列化到会话对象中) .

    [Serializable]
    public class ImageSwapModel {
        // Your class's properties
    }
    

    然后在您的控制器中,您可以执行以下操作:

    [HttpPost]
    public ActionResult Index(ImageSwapModel imageSwap)
    {
        var oldFileFound = false;
        var newFileFound = false;
    
        if (ModelState.IsValid)
        {
            this.HttpContext.Session["ImageSwap"] = imageSwap;
        }
     }
    

    当您想要检索模型时,您可以从会话中获取它,如下所示:

    var imageSwap = (ImageSwapModel)this.HttpContext.Session["ImageSwap"];
    

    Taking it one step further:

    虽然上述方法可以正常工作,但通常直接在代码中引用 HttpContext 对象并不是一个好习惯,因为它会创建与 HttpContext 对象的不必要耦合,这很容易避免 . 相反,您应该选择通过依赖注入注入会话对象的实例 . Here is a similar answer提供了如何做到这一点的基本想法 .

  • 1

    您可以在一个Index操作中将模型传递给它们,从而返回不同的视图

    if(some condition)
    {
       Return View("ViewVersion1", MyModelVersion1);
    }
    else
    {
       Return View("ViewVersion2", MyModelVersion2);
    }
    

相关问题