0

ここではおそらく完全に間違っていると思いますが、それが私が求めていることの一部です。

MVC3 を使用してブログを作成していますが、いくつか問題があります。私のホームページには現在、各ブログ投稿が対応するコメントとトピックとともに正しくリストされています。投稿の数を制限したいので、HomeController のコードを次に示します。

public class HomeController : Controller
{
    private MyDB db = new MyDB();

    public ActionResult Index()
    {
        var posts = (from p in db.Set<BlogPost>()
                     orderby p.DateCreated descending 
                     select new PostViewModel
                                {
                                    Title = p.Title,
                                    DateCreated = p.DateCreated,
                                    Content = p.Content,
                                    Topics = p.Topics,
                                    Comments = p.Comments,
                                    CommentCount = p.Comments.Count
                                }).Take(5).ToList();

        IEnumerable<Topic> topics = from t in db.Topics
                                    select t;

        var blog = new BlogViewModel
        {
            Post = posts,
            Topics = topics.Select(t => new SelectListItem { 
                Value = Convert.ToString(t.id),
                Text = t.Name
            })
        };

        return View(blog);
    }
}

私が言ったように、これはうまくいきます。最終的にはトピックごとに並べ替えたいので、トピックを個別に入力しています(これもどこから始めればよいかわかりませんが、それは別の話です)。

私の主な問題は、選択した 5 つの投稿の下に「次へ」および「前へ」ボタンがあり、クリックすると次の 5 つまたは前の 5 つを取得することです。使用するように言われました...

@Html.ActionLink("Next >>", "ActionName", "Home", Custom arguement?)

HomeController にカスタム メソッドを記述し、次または前の 5 を取得するタイプのソリューションです。これはまったく正しいですか? このようなものに最適な使用シナリオを理解したいと思います。私は MVC3 にまったく慣れていないので、近道を探しているわけではありません。すでにいくつか作っているような気がします。

ご協力いただきありがとうございます。

4

5 に答える 5

0

最適なシナリオが 2 つあります。

Ajax/Jqueryを使用してこれを行うことができます。

2 つは「部分」ビューを使用します。この方法では、誰かが次の 5 つのアクション リンクを押したときに、ビュー全体に影響を与えることはありません。したがって、投稿のみの部分ビューを作成すると、コントローラーは次の 5 つのリクエストを受け取り、5 つの投稿アイテムを持つモデルの部分ビューを返します。

より快適に感じる方を選択してください。ただし、MVC を学習している場合は、2 つを選択する方が練習に適している場合があります。

于 2012-04-26T18:33:51.640 に答える
0

You can take a look at: http://nerddinnerbook.s3.amazonaws.com/Part8.htm . Also if you want to get the data with an ajax request i recommend you to convert partial view containing the data to string ( Return Razor partial view using JSON (ASP MVC 3)) and use jquery to load it (http://api.jquery.com/load/ ).

于 2012-04-26T18:36:07.490 に答える
0

https://github.com/TroyGoode/PagedList

public class HomeController : Controller
{
    public ActionResult Index(int? page)
    {
    var posts = (from p in db.Set<BlogPost>()
                 orderby p.DateCreated descending 
                 select new PostViewModel
                            {
                                Title = p.Title,
                                DateCreated = p.DateCreated,
                                Content = p.Content,
                                Topics = p.Topics,
                                Comments = p.Comments,
                                CommentCount = p.Comments.Count
                            });

    var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
    posts = posts.ToPagedList(pageNumber, 25); // will only contain 25 posts max because of the pageSize

    var blog = new BlogViewModel
    {
        Post = posts,
        Topics = topics.Select(t => new SelectListItem { 
            Value = Convert.ToString(t.id),
            Text = t.Name
        })
    };

    return View(blog);
    }
}
于 2012-04-26T19:01:46.240 に答える
0

コントローラーで別のアクション メソッド (Ajax または通常のいずれか) を要求し、最初のページ レンダリングに使用していたのと同じビューを再利用するだけです。

public ActionResult Index(int? pageNumber)
{
     if(!pageNumber.HasValue)
         return Index();

     var posts = ...; // get posts

     var set = posts.Skip(pageNumber * itemsPerPage).Take(itemsPerPage);
     // or pageNumber - 1 if you want to be 1-index based

     return View(...); //or PartialView() if doing ajax, or even Json() if you want to bind on the client side
}
于 2012-04-26T18:36:18.857 に答える
0

以下のコード例のようにコントローラーを作成できます。

    public ViewResult List(string category, int page = 1) {

        ProductsListViewModel viewModel = new ProductsListViewModel {
            Products = repository.Products
                .Where(p => category == null ? true : p.Category == category)
                .OrderBy(p => p.ProductID)
                .Skip((page - 1) * PageSize)
                .Take(PageSize),
            PagingInfo = new PagingInfo {
                CurrentPage = page,
                ItemsPerPage = PageSize, //4 for example
                TotalItems =  category == null ? 
                    repository.Products.Count() : 
                    repository.Products.Where(e => e.Category == category).Count()
            },
            CurrentCategory = category
        };
        return View(viewModel);
    }

ビュー内に、次のカスタム HTML ヘルパーを配置します。

<div class="pager">
   @Html.PageLinks(Model.PagingInfo, x => Url.Action("List", 
    new {page = x, category = Model.CurrentCategory}))
</div>

ヘルパーのコードは次のとおりです。

public static class PagingHelpers {

    public static MvcHtmlString PageLinks(this HtmlHelper html,
                                          PagingInfo pagingInfo,
                                          Func<int, string> pageUrl) {

        StringBuilder result = new StringBuilder();
        for (int i = 1; i <= pagingInfo.TotalPages; i++) {
            TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
            tag.MergeAttribute("href", pageUrl(i));
            tag.InnerHtml = i.ToString();
            if (i == pagingInfo.CurrentPage)
                tag.AddCssClass("selected");
            result.Append(tag.ToString());
        }

        return MvcHtmlString.Create(result.ToString());
    }
}

この例はこの本から取られました

于 2012-04-26T19:14:20.017 に答える