我是MVC的新人。
我在下面的模型中有一个课程。
public class UserInfo
{
public string Name{get;set;}
public string Surname{get;set;}
}
我有一个像这样的控制器。
public class HomeController : Controller
{
//
// GET: /Home/
List<UserInfo> Users = new List<UserInfo>();
public ActionResult Index()
{
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(UserInfo userInfo)
{
if (ModelState.IsValid)
{
Users.Add(userInfo);
return RedirectToAction("Index");
}
return View();
}
}
每当我在浏览器中按“创建”按钮时,它都会重定向到“索引视图”。
但是List<UserInfo>
是空的。为什么会这样?如何将数据保存到列表中并从List
?
答案 0 :(得分:3)
控制器是无状态的。每次调用动作时都会创建一个新实例,这就是您的列表始终为空的原因。
如果要在控制器操作之间保持列表,则需要某种持久性机制 - 数据库,缓存等。
答案 1 :(得分:1)
我相信Maess首先指出了细节。
即使您的[HTTPPost] Create操作将新用户添加到List对象,也似乎没有任何方法可以将输入的数据保存到持久存储中。每次实例化控制器时,List对象都将为空,因为您当前已对其进行编码。
如果您希望将数据存储到数据库,请从asp.net查看本教程的一种方法:
答案 2 :(得分:1)
在您的视图中为对象添加此引用:
Inherits="System.Web.Mvc.ViewPage<List<UserInfo>>" %>
在你的班上改变这个:
List<UserInfo> Users = new List<UserInfo>();
public ActionResult Index()
{
return View(Users);
}
但是为了将列表数据保存在内存中,最好将List对象声明为静态,因为这样他就会保留已经添加的信息。例如:
public class HomeController : Controller
{
public static List<UserInfo> Users = null;
//
// GET: /Home/
public ActionResult Index()
{
return View(Users);
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(UserInfo userInfo)
{
if (ModelState.IsValid)
{
Users.Add(userInfo);
return RedirectToAction("Index");
}
return View();
}
}
答案 3 :(得分:1)
使您的列表静态
static List<UserInfo> Users = new List<UserInfo>();
答案 4 :(得分:1)
每次使用List<T>
关键字创建new
时,都会创建一个没有任何数据类型的实例,因此使用DatabaseContext从数据库中获取数据并将其绑定到列表中,如下所示:
List<UserInfo> Users = new List<UserInfo>();
Users.Add(_databasecontext.Users.ToList());
并将其返回视图。