재우니의 블로그


DisplayMutiplePartialView.zip




base Controller 를 생성해 보자.

여기에는 JSON 을 사용하는지에 대한 여부를 기술한 부분이다.


    public class BaseController : Controller
    {
        protected internal virtual CustomJsonResult CustomJson(object json = null, bool allowGet = true)
        {
            return new CustomJsonResult(json)
            {
                JsonRequestBehavior = allowGet ? JsonRequestBehavior.AllowGet : JsonRequestBehavior.DenyGet
            };
        }
    }

    public class CustomJsonResult : JsonResult
    {
        public CustomJsonResult(object json)
        {
            _json = json;
            _partials = new List<KeyValuePair<string, object>>();
            _results = new List<string>();
        }

        private readonly object _json;
        private readonly IList<KeyValuePair<string, object>> _partials;
        private readonly IList<string> _results;

        public CustomJsonResult AddPartialView(string partialViewName = null, object model = null)
        {
            _partials.Add(new KeyValuePair<string, object>(partialViewName, model));
            return this;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            foreach (var partial in _partials)
            {
                var html = ControllerHelper.RenderPartialViewToString(context, partial.Key, partial.Value);
                _results.Add(html);
            }
            base.Data = Data;
            base.ExecuteResult(context);
        }

        public new object Data
        {
            get
            {
                return new
                {
                    Html = _results,
                    Json = _json
                };
            }
        }
    }


ControllerHelper 클래스를 구현해 보자.이는 partial view  의 내용을 문자열 형태로 변환해 주는 역할을 합니다.



    public static class ControllerHelper
    {
        public static string RenderPartialViewToString(ControllerContext context, string viewName, object model)
        {
            var controller = context.Controller;

            var partialView = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);

            var stringBuilder = new StringBuilder();
            using (var stringWriter = new StringWriter(stringBuilder))
            {
                using (var htmlWriter = new HtmlTextWriter(stringWriter))
                {
                    controller.ViewData.Model = model;
                    partialView.View.Render(
                        new ViewContext(
                            controller.ControllerContext,
                            partialView.View,
                            controller.ViewData,
                            new TempDataDictionary(),
                            htmlWriter),
                        htmlWriter);
                }
            }
            return stringBuilder.ToString();
        }
    }


이제 2개의 partial views 를 추가할 것입니다.


        public JsonResult CreatePartialView()
        {
            MyMultipleUpdateViewModel obj = new MyMultipleUpdateViewModel();
            obj.myTest1ViewModel = new MyTest1ViewModel();
            obj.myTest1ViewModel.MyTestUpdate = "Test1s " + DateTime.Now.ToString();

            obj.myTest2ViewModel = new MyTest2ViewModel();
            obj.myTest2ViewModel.MyTestUpdate = "Test2s " + DateTime.Now.ToString();
            var json = new { Header = "Headers", Footer = "Footers" };
            return CustomJson(json).AddPartialView("_MyTest1PartialView", obj)
                .AddPartialView("_MyTest2PartialView", obj);
        }

참고로 model 정보는 아래와 같습니다.


namespace DropdownGrid.Models
{
    public class MyTest1ViewModel
    {
        public string MyTestUpdate;
    }
    public class MyTest2ViewModel
    {
        public string MyTestUpdate;
    }
    public class MyMultipleUpdateViewModel
    {
        public MyTest1ViewModel myTest1ViewModel;

        public MyTest2ViewModel myTest2ViewModel;
    }
}


아래 사진은 부분 뷰 위치를 알려드립니다.



@model DropdownGrid.Models.MyMultipleUpdateViewModel

@{
    ViewBag.Title = "Display Mutiple Partial View Demo";
}

<h2>Index</h2>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.10.2.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>


<script>
    function GetData(url, onSuccess) {
        
        $.ajax({
            type: "GET",
            cache: false,
            url: url,
            dataType: "json",
            success: function (data, textStatus, jqxhr) {
                onSuccess(data.Json, data.Html);
            },
            error: function (data, text, error) {
                alert("Error: " + error);
            }
        });
        return false;
    }
    function UpdateDiv(json, html) {        
        $("#PartialViewDiv1").html(html[0]);
        $("#PartialViewDiv2").html(html[1]);        
    }
</script>

<input type="button" onclick="GetData('/DisplayMutiplePartialView/CreatePartialView', UpdateDiv);" value="Display Multiple Partial View" />
<br>
<br>
     <div id="PartialViewDiv1"></div>
<br>
<br>
 <div id="PartialViewDiv2"></div>
<br>
<br>