4

私の質問はこれに関連していますが、質問を変更するのではなく、新しい質問をするがよいと思いました。

_taxonomyService.GetContentItems(term)を使用してIContentアイテムのリストを取得しました

上記の質問で@BertrandLeRoyによって提案されたように

しかし、これを便利なHtml文字列に変換するにはどうすればよいですか?ajax投稿を介してクライアントで更新できますか?

public class HomeController : Controller
    {
        private readonly IOrchardServices _services;
        private readonly IBlogService _blogService;
        private readonly IBlogPostService _blogPostService;
        private readonly IFeedManager _feedManager;
        private readonly IArchiveConstraint _archiveConstraint;
        private readonly ITaxonomyService _taxonomyService;

        public HomeController(
            IOrchardServices services, 
            IBlogService blogService, 
            IBlogPostService blogPostService,
            IFeedManager feedManager,
            IShapeFactory shapeFactory,
            IArchiveConstraint archiveConstraint,
            ITaxonomyService taxonomyService) {
            _services = services;
            _blogService = blogService;
            _blogPostService = blogPostService;
            _feedManager = feedManager;
            _archiveConstraint = archiveConstraint;
            T = NullLocalizer.Instance;
            Shape = shapeFactory;
            _taxonomyService = taxonomyService;
            }

        dynamic Shape { get; set; }
        public Localizer T { get; set; }

        public ActionResult Index()
        {
            return View();
        }


    [HttpPost]
    public JsonResult ListByArchive(string path, IEnumerable<string> category)
    {
    try
    {
        // get year and month from path
        path = path.ToLower().Substring(path.LastIndexOf(@"/archive/", StringComparison.Ordinal) + 9);

        var date = path.Split('/');
        var month = int.Parse(date[1]);
        var year = int.Parse(date[0]);

        // get list of terms ids from strings 
        var taxonomyPart = _taxonomyService.GetTaxonomyByName("Category");

        var terms = category.Select(cat => _taxonomyService.GetTermByName(taxonomyPart.Id, cat)).ToList();

        // get list of content items by term avoiding duplicates 
        var posts = new List<IContent>();

        foreach (var term in terms)
        {
            var items = _taxonomyService.GetContentItems(term);

            foreach (var item in items)
            {
                if (!posts.Select(p => p.Id).Contains(item.Id))
                {
                    posts.Add(item);
                }
            }
        }


        // filter by date 
        var byDate = posts.Where(x =>
                    {
                        var publishedUtc = x.ContentItem.As<CommonPart>().CreatedUtc;
                        return
                            publishedUtc != null 
                            && publishedUtc.Value.Month == month 
                            && publishedUtc.Value.Year == year;
                    });

...。

これでIContentのリストが取得されますが、レンダリングされたリストのhtmlを取得するにはどうすればよいですか?

私はもう試した

var range = byDate.Select(x => _services.ContentManager.BuildDisplay(x, "Summary"));

                var list = Shape.List();

                list.AddRange(range);


                dynamic viewModel = Shape.ViewModel().ContentItems(list);

                var html = View((object)viewModel);

 return Json(new { html = html });

しかし、それは空のビューを返します、

{"html":{"MasterName":"","Model":[],"TempData":[],"View":null,"ViewBag":{},"ViewData":[],"ViewEngineCollection":[{"HostContainer":{}}],"ViewName":""}}

orchard.blogモジュールのビューと一致するListByArchive.cshtmlというビューがあります。

余談ですが、ジェイソンの結果ではなく、部分的なビューの結果を返す必要がありますが、アクションの結果タイプを変更すると、サーバーから404.の結果が得られます。

4

1 に答える 1

2

これは、あなたが思うように動作することは決してありません:

var html = View((object)viewModel);

コンテンツ アイテムを表す HTML を返す最も簡単な方法は、次のとおりです。

  • アクションをThemedAttributeでマークします。[Themed(false)]
  • new ShapeResult(this, viewModel)の代わりに(全体表示) またはnew ShapePartialResult(this, viewModel)(部分表示) を返すJson(new { html = html })

アクション内で形状/ビューを文字列にレンダリングすることも可能ですが、より注意が必要です。

編集:/Views/ViewModel.cshtmlすでにファイルが配置されていると想定しました。以下に記載されているBertrand Le Royのように、存在しない場合は、 を使用して形状を作成できるように追加する必要がありますShape.ViewModel()

于 2012-10-26T15:19:45.130 に答える