ASP.NET MVC -HybridViewResult(ViewResult /partialViewResult)
-
03-10-2019 - |
質問
ajaxrequestまたはhttprequestの依存で戻ってくるハイブリッドビューレストを構築することは可能ですか PartialViewResult
また ViewResult
?
ISAJAXREQUEST-> partialViewResult!isajaxRequest-> return viewResult
私が知っている限り、私のHybridViewResultはViewResultBaseから派生する必要があります。
しかし、FindViewメソッドを実装する方法は?
解決
試す:
public class HybridViewResult : ActionResult
{
public string ViewName { get; set; }
public HybridViewResult () { }
public HybridViewResult (string viewName ) { this.ViewName = viewName ; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null) throw new ArgumentNullException("context");
var usePartial = ShouldUsePartial();
ActionResult res = GetInnerViewResult(usePartial);
res.ExecuteResult(context);
}
private ActionResult GetInnerViewResult(bool usePartial)
{
var view = ViewName;
ActionResult res;
if(String.IsNullOrEmpty(view)) {
res = usePartial ? new PartialViewResult(view) : new ViewResult(view);
}
else {
res = usePartial ? new PartialViewResult() : new ViewResult();
}
return res;
}
private bool ShouldUsePartial(ControllerContext context) {
return false; //your code that checks if you need to use partial here
}
}
必要に応じてコンストラクターとgetInnerViewResultのバリエーションを追加して、モデルに合格します。
他のヒント
これは、エグラシウスの答えに少し剥ぎ取られたものです。 Jsonresultを返す必要があることを除いて、私は実際に同様の問題に取り組んでいます。
(テストされていない)normalorOrajaxResultを使用すると、Ajax以外のリクエストとAjaxリクエストのアクション結果を指定できます。これらは行動の結果であるため、リダイレクト、ビュー、部分的、およびJSONビューの結果を混同することができます。
public class NormalOrAjaxResult : ActionResult
{
private readonly ActionResult _nonAjaxActionResult;
private readonly ActionResult _ajaxActionResult;
public NormalOrAjaxResult(ActionResult nonAjaxActionResult, ActionResult ajaxActionResult)
{
_nonAjaxActionResult = nonAjaxActionResult;
_ajaxActionResult = ajaxActionResult;
}
public override void ExecuteResult(ControllerContext context)
{
var isAjaxRequest = context.HttpContext.Request["isAjax"];
if (isAjaxRequest != null && isAjaxRequest.ToLower() == "true")
{
_ajaxActionResult.ExecuteResult(context);
} else
{
_nonAjaxActionResult.ExecuteResult(context);
}
}
}
その場合、2つの異なるアクションを作成することはできませんか?単に入れることができる「共有」ロジック [nonAction]
方法?
私はここのパーティーに本当に遅れていることを知っていますが、これらは私にはまったく正しいようには見えなかったので、ここに私の2セントがあります:
public class PartialViewConverter : ViewResult
{
public ViewResultBase Res { get; set; }
public PartialViewConverter(ViewResultBase res) { Res = res; }
public override void ExecuteResult(ControllerContext context)
{
Res.ExecuteResult(context);
}
public static ViewResult Convert(ViewResultBase res)
{
return new PartialViewConverter(res);
}
}
使用法:
return PartialViewConverter.Convert(PartialView());
そして、ビューをオーバーライドする場合は、コントローラーで
protected override ViewResult View(string viewName, string masterName, object model)
{
//Whichever condition you like can go here
if (Request.QueryString["partial"] != null)
return PartialViewConverter.Convert(PartialView(viewName, model));
else
return base.View(viewName, masterName, model);
}
ビューを返すアクションメソッドは、要求されたときに部分的な部分を自動的に返します。
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
//This will return a partial if partial=true is passed in the querystring.
return View();
}
所属していません StackOverflow