0

私が取り組んでいる Web サイトは、ajax/json と knockout.js に大きく依存しています。メソッドを返すときに JsonResult にラップせずに、多くのコントローラーがビューに合わせた「json オブジェクト」を返すようにしたいと考えています。

これは、複数の呼び出しを 1 つの親オブジェクトに簡単に合成できることを意味しますが、アクションも個別に呼び出すことができます。

簡単な例:

public object Main(int groupId)
{
    var viewModel = new
    {
        Persons    = Employees(groupId),
        Messages   = AllMessages()
    };

    return viewModel;
}

public object Employees(int groupId)
{
    return DatabaseContext.Employees.Where(e => e.GroupId == groupId).ToList();
}

public object AllMessages()
{
    return DatabaseContext.Messages.ToList();
}

OnActionExecuted返されたオブジェクトをキャプチャして、その時点で結果全体を final にラップできることを望んでいましたJsonResult

結果はすでに文字列に変換され、through に取り込まれてContentResultいます。

何か案は?:) ありがとう、

4

2 に答える 2

0

答えてくれてありがとう。定型文をできるだけ小さくしたいので、von v. の解には行きません。

結局、私は次のアプローチを試しています。今のところかなりうまくいっているようですが、実際の運用環境でテストする必要があります。

これに関して (セキュリティ上の) 懸念がある場合は、コメントでお知らせください。

// BaseController
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var returnType = ((ReflectedActionDescriptor)filterContext.ActionDescriptor).MethodInfo.ReturnType;

    // is the returnType not deriving from ActionResult? Automatically wrap it in a JsonResult
    if ( !typeof(ActionResult).IsAssignableFrom(returnType) )
    {
        var result = filterContext.ActionDescriptor.Execute(filterContext, filterContext.ActionParameters);

        filterContext.Result = Json( result );
    }
}
于 2013-04-22T12:51:15.277 に答える