我需要为HttpVerb使用相同的ViewBag对象,这些对象是HttpGet和HttpPost。因此我不想两次声明ViewBags。我创建了一个参数化方法,每当我想要使用它时,我就会调用此方法跟着样本。这是真的方式,还是你对这个问题有任何解决方案?
public ActionResult Index()
{
SetViewObjects(null);
return View();
}
[HttpPost]
public ActionResult Index(Person model)
{
SetViewObjects(model.PersonId);
return View(model);
}
public void SetViewObjects(short? personId)
{
IEnumerable<Person> person = null;
if(personId.HasValue)
{
person = db.GetPerson().Where(m=>m.PersonId == personId);
}
else
{
person = db.GetPerson();
}
ViewBag.Person = person;
}
答案 0 :(得分:2)
Viewbag是动态分配的。你不需要在你的HttpGet Action中声明。 您可以在HttpGet索引视图中使用ViewBag.Person,而无需在相应的操作中声明它。 它的值将为null。
答案 1 :(得分:1)
只需使用this.SetViewObjects
public ActionResult Index()
{
this.SetViewObjects(null);
return View();
}
[HttpPost]
public ActionResult Index(Person model)
{
this.SetViewObjects(model.PersonId);
return View(model);
}
只需将它作为ControllerBase的扩展方法,例如
public static void ControllerExt
{
public static void SetViewObjects(this ControllerBase controller,short? personId)
{
IEnumerable<Person> person = null;
if(personId.HasValue)
{
person = db.GetPerson().Where(m=>m.PersonId == personId);
}
else
{
person = db.GetPerson();
}
controller.ViewBag.Person = person;
}
}
答案 2 :(得分:0)
你说你需要使用相同的ViewBag对象到底是什么意思?每次调用SetViewObjects函数时,它都会创建一个新的ViewBag对象。
如果您需要使用ViewBag来传递数据集合,我建议只使用以下内容(这仍然不是最佳方式):
[HttpGet]
public ActionResult Index()
{
ViewBag.Person = db.GetPerson();
return View();
}
[HttpPost]
public ActionResult Index(User model)
{
ViewBag.Person = db.GetPerson().Where(m => m.PersonId == model.PersonId);
return View(model);
}
重载的Index函数虽然对我没有多大意义 - 你从表单Post获得一个User模型然后在数据库中找到一个具有相同id的用户 - 这可能是与一个用户相同的用户您从视图中收到,然后将两个模型类传递给同一视图,但方式不同。无论如何,理想情况下我会使用以下appr:
[HttpGet]
public ActionResult Index()
{
return View(db.GetPerson());
}
[HttpPost]
public ActionResult Index(User model)
{
return View(db.GetPerson().Where(m => m.PersonId == model.PersonId));
}