在MVC中使用有效的ViewBag

时间:2014-09-10 04:46:24

标签: asp.net asp.net-mvc viewbag httpverbs

我需要为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;
}

3 个答案:

答案 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));
    }