How to set view model on ViewResult in request filter?

zt9788 picture zt9788 · Nov 18, 2013 · Viewed 16.4k times · Source

I make a MVC project and I want set Model into View from filter.

But I do not kown ,How can I do this.

the Model:

public class TestModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}

Contorller:

[CustomFilter(View = "../Test/Test")]//<===/Test/Test.cshtml
public ActionResult Test(TestModel testModel)//<===Model from Page
{
      //the Model has Value!!
       // if has some exception here
        return View(model);//<=====/Test/Test.cshtml
}

filter(just demo):

public override void OnActionExecuting(ActionExecutingContext filterContext){
     ViewResult vr = new System.Web.Mvc.ViewResult()
     {
            ViewName = this.View,//<======/Test/Test.cshtml
            ViewData = filterContext.Controller.ViewData                             
      };
      //How can I set Model here?!!
      vr.Model = ???? //<========the Model is only get
      filterContext.Result = vr;
}

Edit begin thanks for @Richard Szalay @Zabavsky @James @spaceman

change filter extends to HandleErrorAttribute

  ViewResult vr = new System.Web.Mvc.ViewResult()
     {
            ViewName = this.View,//<======/Test/Test.cshtml
            ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
            {
                //I want get testModel from Action's paramater
                //the filter extends HandleErrorAttribute
                Model = new { ID = 3, Name = "test" }// set the model
            }                             
      };

Edit end

Test/Test.chtml

@model TestModel
<h2>Test</h2>
@Model //<=====model is null

when I request

http://localhost/Test/Test?ID=3&Name=4

The Test Page can not get Model.

Answer

Zabavsky picture Zabavsky · Nov 18, 2013
ViewResult vr = new System.Web.Mvc.ViewResult
    {
        ViewName = this.View, //<======/Test/Test.cshtml
        ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
            {
                Model = // set the model
            }
    };