C# MVC全局变量在输入另一个操作方法时重置为null 公共类音乐控制器:控制器 { 用户当前用户; 公共PartialViewResult上传音乐() { 返回PartialView(“上传音乐”); } [HttpPost] 公共操作结果上载音乐(列出文件) { EntityDBContext db=新的EntityDBContext(); List uploadedSongs=新列表(); foreach(文件中的var文件) { 如果(文件!=null) { string songName=Path.GetFileName(file.FileName); byte[]songAsBytes=新字节[file.ContentLength]; 使用(BinaryReader br=new BinaryReader(file.InputStream)) { songAsBytes=br.ReadBytes(file.ContentLength); } //在数据库中保存新记录 新歌 { SongName=SongName, SongBytes=songAsBytes }; 上传歌曲。添加(歌曲); } } 字符串userName=User.Identity.Name; currentUser=db.Users.Where(x=>x.Username==Username.First(); currentUser.UserSongs=上传的歌曲; 返回ShowSongs(currentUser.UserSongs); } public ActionResult ShowSongs(列出用户歌曲) { 返回视图(“ShowSongs”,用户歌曲); } 公共行动结果发布() { EntityDBContext db=新的EntityDBContext(); foreach(currentUser.UserSongs中的var song) { 如果(歌曲!=null) { db.Songs.Add(歌曲); db.SaveChanges(); } } 返回视图(); } }

C# MVC全局变量在输入另一个操作方法时重置为null 公共类音乐控制器:控制器 { 用户当前用户; 公共PartialViewResult上传音乐() { 返回PartialView(“上传音乐”); } [HttpPost] 公共操作结果上载音乐(列出文件) { EntityDBContext db=新的EntityDBContext(); List uploadedSongs=新列表(); foreach(文件中的var文件) { 如果(文件!=null) { string songName=Path.GetFileName(file.FileName); byte[]songAsBytes=新字节[file.ContentLength]; 使用(BinaryReader br=new BinaryReader(file.InputStream)) { songAsBytes=br.ReadBytes(file.ContentLength); } //在数据库中保存新记录 新歌 { SongName=SongName, SongBytes=songAsBytes }; 上传歌曲。添加(歌曲); } } 字符串userName=User.Identity.Name; currentUser=db.Users.Where(x=>x.Username==Username.First(); currentUser.UserSongs=上传的歌曲; 返回ShowSongs(currentUser.UserSongs); } public ActionResult ShowSongs(列出用户歌曲) { 返回视图(“ShowSongs”,用户歌曲); } 公共行动结果发布() { EntityDBContext db=新的EntityDBContext(); foreach(currentUser.UserSongs中的var song) { 如果(歌曲!=null) { db.Songs.Add(歌曲); db.SaveChanges(); } } 返回视图(); } },c#,null,global,C#,Null,Global,ShowSongs视图: public class MusicController : Controller { User currentUser; public PartialViewResult UploadMusic() { return PartialView("_UploadMusic"); } [HttpPost] public ActionResult UploadMusic(List<HttpPosted

ShowSongs视图:

public class MusicController : Controller
{
    User currentUser;

    public PartialViewResult UploadMusic()
    {

        return PartialView("_UploadMusic");
    }

    [HttpPost]
    public ActionResult UploadMusic(List<HttpPostedFileBase> files)
    {
        EntityDBContext db = new EntityDBContext();
        List<Song> uploadedSongs = new List<Song>();

        foreach (var file in files)
        {
            if (file != null)
            {
                string songName = Path.GetFileName(file.FileName);
                byte[] songAsBytes = new byte[file.ContentLength];

                using (BinaryReader br = new BinaryReader(file.InputStream))
                {
                    songAsBytes = br.ReadBytes(file.ContentLength);
                }

                //Save new record in database
                Song song = new Song
                {
                    SongName = songName,
                    SongBytes = songAsBytes
                };

                uploadedSongs.Add(song);
            }
        }

        string userName = User.Identity.Name;
        currentUser = db.Users.Where(x => x.Username == userName).First();
        currentUser.UserSongs = uploadedSongs;

        return ShowSongs(currentUser.UserSongs);
    }

    public ActionResult ShowSongs(List<Song> UserSongs)
    {
        return View("ShowSongs", UserSongs);
    }

    public ActionResult Publish()
    {
        EntityDBContext db = new EntityDBContext();

        foreach (var song in currentUser.UserSongs)
        {
            if (song != null)
            {
                db.Songs.Add(song);
                db.SaveChanges();
            }
        }
        return View();
    }
}
@型号列表
@ActionLink(“发布”、“发布”)
问题

所以我在控制器的顶部声明currentUser。然后我在这里为这一行赋值
currentUser.UserSongs=uploadedSongs
这可以正常工作,但当代码进入
Publish()
currentUser.UserSongs
时为空


分配值后,我需要在多个操作方法中访问currentUser.UserSongs,但当它进入另一个操作时,它似乎会重置为null。

为此,您可以使用TempData,即在TempData dictionary中存储值。这里的一个问题是,MVC在回发期间(即在同一控制器的不同操作期间或为此调用另一个控制器期间)不会更改变量的值。您可以按照建议使用临时变量TempData。

为此,您可以使用TempData,即在TempData字典中存储值。这里的一个问题是,MVC在回发期间(即在同一控制器的不同操作期间或为此调用另一个控制器期间)不会更改变量的值。您可以按照建议使用临时变量TempData。

为此,您可以使用TempData,即在TempData字典中存储值。这里的一个问题是,MVC在回发期间(即在同一控制器的不同操作期间或为此调用另一个控制器期间)不会更改变量的值。您可以按照建议使用临时变量TempData。

为此,您可以使用TempData,即在TempData字典中存储值。这里的一个问题是,MVC在回发过程中不会改变变量的值,即在同一控制器的不同操作期间或为此调用另一个控制器期间,您可以按照建议使用临时变量TempData。

对象状态不会跨请求维护,这不是web应用程序的工作方式。每次向服务器发送请求时,都会创建控制器对象的新实例。因此,任何实例级别的值都是新的

为了跨请求持久化信息,您需要将其持久化到某个位置。对于类似用户上下文的内容,会话状态是一种常见的选择。您可能希望将其包装在公共提供程序接口中,以避免控制器与HTTP上下文耦合,但其核心是在会话中存储很简单:

@model List<Vidafo.Models.Song>

@Html.ActionLink("Publish", "Publish")
(您甚至可以在每次请求时从数据库中重新获取数据。虽然性能稍差,但非常简单和健壮。)

不过,不要将ASP.NET标识系统计算在内。ASP.NET非常擅长为您抽象出这些内容。您已在此处使用它:

HttpContext.Current.Session["someKey"] = someValue;

然后使用该值从数据库中获取用户。您可以扩展标识系统以存储符合您需要的自定义用户对象。但在这个问题之外,这是一个更大范围的工作。

对象状态不在请求之间维护,这不是web应用程序的工作方式。每次向服务器发送请求时,都会创建控制器对象的新实例。因此,任何实例级别的值都是新的

为了跨请求持久化信息,您需要将其持久化到某个位置。对于类似用户上下文的内容,会话状态是一种常见的选择。您可能希望将其包装在公共提供程序接口中,以避免控制器与HTTP上下文耦合,但其核心是在会话中存储很简单:

@model List<Vidafo.Models.Song>

@Html.ActionLink("Publish", "Publish")
(您甚至可以在每次请求时从数据库中重新获取数据。虽然性能稍差,但非常简单和健壮。)

不过,不要将ASP.NET标识系统计算在内。ASP.NET非常擅长为您抽象出这些内容。您已在此处使用它:

HttpContext.Current.Session["someKey"] = someValue;

然后使用该值从数据库中获取用户。您可以扩展标识系统以存储符合您需要的自定义用户对象。但在这个问题之外,这是一个更大范围的工作。

对象状态不在请求之间维护,这不是web应用程序的工作方式。每次向服务器发送请求时,都会创建控制器对象的新实例。因此,任何实例级别的值都是新的

为了跨请求持久化信息,您需要将其持久化到某个位置。对于类似用户上下文的内容,会话状态是