ASP.NET MVC - HybridViewResult (ViewResult / PartialViewResult) - PullRequest
3 голосов
/ 17 сентября 2010

Можно ли создать гибридный ViewResult, который возвращает в зависимости от AjaxRequest или HttpRequest a PartialViewResult или ViewResult?

IsAjaxRequest -> вернуть PartialViewResult! IsAjaxRequest -> вернуть ViewResult

Насколько я знаю, мой HybridViewResult должен быть производным от ViewResultBase.

Но как реализовать метод FindView?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2010

Попробуйте:

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, например, для передачи Model.

2 голосов
/ 17 сентября 2010

Это немного более урезанный ответ на ответ Эгласиуса. Я на самом деле занимаюсь аналогичной проблемой, за исключением того, что мне нужно вернуть JsonResult.

(Не проверено) NormalOrAjaxResult просто позволяет вам указать результат действия для запроса без ajax и один для запроса ajax. Поскольку это ActionResults, вы можете смешивать результаты Redirect, View, Partial и Json view.

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);
        }
    }
}
1 голос
/ 15 марта 2014

Я знаю, что я действительно опаздываю на вечеринку, но мне это показалось не совсем правильным, так что вот мои 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());

И затем в вашем контроллере, если вы переопределите View

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();
}
1 голос
/ 17 сентября 2010

Вы не можете просто сделать 2 разных действия в этом случае? «разделяемая» логика, которую вы можете просто вставить в метод [nonAction]?

...