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
テストページはモデルを取得できません。
ViewResult vr = new System.Web.Mvc.ViewResult
{
ViewName = this.View, //<======/Test/Test.cshtml
ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
{
Model = // set the model
}
};
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
};
}
フィルタコンテキストを変更し、ビュー、モデル、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;
このようにして、ビューは必要に応じてモデルを受け取ります。
モデルプロパティは実際には単なるViewDataDictionaryであり、実際のモデルでそのインスタンスを初期化できます。
vr.Model = new ViewDataDictionary(model);
次のように、filtercontextからコントローラーを取得し、コントローラーでViewメソッドを使用できます。
filterContext.Result = (filterContext.Controller as Controller).View(model);