2014-09-10 4 views
0

Мне нужно использовать те же объекты ViewBag для HttpVerb, что и HttpGet и HttpPost. Поэтому я не хочу объявлять ViewBags дважды. Я создал параметрический метод, и я вызываю этот метод всякий раз, когда я хотите использовать его в качестве примера sample.Is true или у вас есть какое-либо решение по этой проблеме?Эффективный ViewBag с использованием в MVC

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; 
} 

ответ

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; 
    } 
} 
+0

Кажется полезным. Все правильно, я хочу задать вопрос? Верно ли с помощью многозадачности viewbag внутри метода? –

2

Суммарное обозначение суммируется динамически. вам не нужно объявлять в своем действии HttpGet. Вы можете использовать ViewBag.Person в своем представлении индекса HttpGet, не объявляя его в соответствующем действии. Его значение будет равно нулю.

+0

Во-первых, спасибо за reply.If я не объявлять ViewBag внутри того, что я назвал страницы, брошенная exception.Thus я использовал viewbag внутри метода вместо использования дважды. –

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, хотя и не имеет большого смысла для меня - вы получаете модель User из формы Post, а затем находите в базе данных пользователя с тем же идентификатором, который, вероятно, будет тем же пользователем, что и тот, который вы получили из представления, а затем вы передаете два класса модели в один и тот же вид но по-разному. Во всяком случае, в идеале я хотел бы использовать следующий провер:

[HttpGet] 
    public ActionResult Index() 
    { 
     return View(db.GetPerson()); 
    } 

    [HttpPost] 
    public ActionResult Index(User model) 
    { 
     return View(db.GetPerson().Where(m => m.PersonId == model.PersonId)); 
    }