web-dev-qa-db-ja.com

リクエストフィルターのViewResultにビューモデルを設定するにはどうすればよいですか?

MVCプロジェクトを作成し、モデルをフィルターからビューに設定したいと思います。

しかし、私は知りません、どうすればこれを行うことができますか。

モデル:

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

コントローラー:

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

フィルタ(デモのみ):

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

編集開始 @Richard Szalay @Zabavsky @ James @ spacemanに感謝

変更フィルターは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
            }                             
      };

編集終了

Test/Test.chtml

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

リクエストしたとき

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

テストページはモデルを取得できません。

19
zt9788
ViewResult vr = new System.Web.Mvc.ViewResult
    {
        ViewName = this.View, //<======/Test/Test.cshtml
        ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
            {
                Model = // set the model
            }
    };
22
Zabavsky

asp.net mvcソースから、ビューデータにモデルを設定するだけです。 http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs

 protected internal virtual ViewResult View(string viewName, string masterName, object model)
    {
        if (model != null)
        {
            ViewData.Model = model;
        }

        return new ViewResult
        {
            ViewName = viewName,
            MasterName = masterName,
            ViewData = ViewData,
            TempData = TempData,
            ViewEngineCollection = ViewEngineCollection
        };
    }
5
spaceman

フィルタコンテキストを変更し、ビュー、モデル、ViewDataなどを設定できます。あなたはいくつかのことを考慮に入れなければなりません:

// You can specify a model, and some extra info, like ViewBag:
ViewDataDictionary viewData = new ViewDataDictionary
{
    Model = new MyViewModel
    {
        ModelProperty = ...,
        OtherModelProperty = ...,
        ...
    } 
};

// You can take into account if it's a partial or not, to return a View 
// or Partial View (casted to base, to set the remaining data):
ViewResultBase result = filterContext.IsChildAction
    ? new PartialViewResult()
    : (ViewResultBase) (new ViewResult());

// Set the remaining data: Name of the View, (if in Shared folder) or
// Relative path to the view file with extension, like "~/Views/Misc/AView.cshtml"
result.ViewName = View;                     
result.ViewData = viewData;     // as defined above

// Set this as the result
filterContext.Result = result;  

このようにして、ビューは必要に応じてモデルを受け取ります。

4
JotaBe

モデルプロパティは実際には単なるViewDataDictionaryであり、実際のモデルでそのインスタンスを初期化できます。

vr.Model = new ViewDataDictionary(model);
3
James

次のように、filtercontextからコントローラーを取得し、コントローラーでViewメソッドを使用できます。

filterContext.Result = (filterContext.Controller as Controller).View(model);
0
Richard Garside