C# 如何使用自定义方法/ActionLink创建页面?

C# 如何使用自定义方法/ActionLink创建页面?,c#,asp.net,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc 3,Razor,我可能在这里完全错了,但这部分是我要问的 我正在使用MVC3创建一个博客,我遇到了一些问题。我的主页目前正确地列出了每个博客文章及其相应的评论和主题。我希望它被限制在一些帖子中,所以这里是我在HomeController中的代码 public class HomeController : Controller { private MyDB db = new MyDB(); public ActionResult Index() { var posts =

我可能在这里完全错了,但这部分是我要问的

我正在使用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);
    }
}
我在HomeController中编写自定义方法并获取下一个或上一个方法的解决方案类型。这完全正确吗?我想了解这样的东西的最佳使用场景。我是MVC3的新手,所以我不是在寻找捷径,我觉得我可能已经做了一些


谢谢你的帮助。

我看到两种最好的情况:

您可以使用Ajax/Jquery来实现这一点

二是使用“局部”视图。这样,当有人在接下来的五天中按下操作链接时,您不会影响整个视图。因此,您只需要为post创建一个部分视图,然后控制器接收下五个post的请求,并返回一个包含五个post项的模型的部分视图

选择哪一个你觉得更舒服,但如果你正在学习MVC,选择二可能更适合你练习。

你可以看一下:。
另外,如果您希望通过ajax请求获取数据,我建议您将包含数据的部分视图转换为string(),并使用jquery加载()。

我会在您的控制器上请求另一个操作方法(使用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
}

公共类HomeController:控制器
{
公共行动结果索引(int?页)
{
var posts=(从db.Set()中的p开始)
orderby p.DateCreated降序
选择新的PostViewModel
{
标题=p.标题,
DateCreated=p.DateCreated,
内容=p.内容,
主题=p.主题,
注释=p.注释,
CommentCount=p.Comments.Count
});
var pageNumber=page±1;//如果查询字符串中未指定页面,则默认为第一页(1)
posts=posts.ToPagedList(pageNumber,25);//由于页面大小,最多只包含25篇文章
var blog=新的BlogViewModel
{
职位=职位,
Topics=Topics.Select(t=>newselectListItem{
值=转换为字符串(t.id),
Text=t.名称
})
};
返回视图(博客);
}
}

您可以像下面的示例代码那样创建控制器:

    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>

@PageLinks(Model.pagininfo,x=>Url.Action(“列表”),
新{page=x,category=Model.CurrentCategory})
以下是帮助器的代码:

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());
    }
}
公共静态类分页帮助器{
公共静态MvcHtmlString页面链接(此HtmlHelper html,
PaginInfo PaginInfo,
Func页面(URL){
StringBuilder结果=新建StringBuilder();

对于(int i=1;我觉得这很好用。我花了一些时间根据我的设置来弄清楚到底该做什么,但我成功了。谢谢!我知道我可以从他们创建的模板中选择,但是有没有其他方法可以自定义它?CSS似乎很有限。而且我觉得这可能不是最好的做法?url当前是/?页=1我觉得应该是/1/的位置?您可以为页面添加自定义路由,并将页面参数标记为可选。
<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());
    }
}