2013-03-16 158 views
1

我对Web开发和asp.net mvc都很陌生,我正在尝试创建一个博客作为我的第一个项目。如何使用自定义动作在asp.net中生成自定义网址mvc

现在,在博客中每个帖子都有自己的页面(有点像每个问题有一个新页面的stackoverflow)的规范。但我很难理解我将如何实现这一目标。

因为例如每个新页面都必须有自己的视图和自己的操作方法。现在假设有1000个博客帖子,这意味着动态创建控制器中的1000个视图和1000个动作。

当然必须有其他方法。在这个问题上的一点指导将有助于很多。

回答

2

您将只有一个操作和一个视图,但不同的博客文章有不同的数据(视图模型)。因此,举例来说,假设你声明一个特殊的路径为您的博客帖子:

routes.MapRoute(
    "BlogPostDetails", 
    "posts/{id}/{title}", 
    new { controller = "Posts", action = "Details" } 
); 

这里我指定称为title额外的URL参数,使网址更加SEO友好(如“/职位/ 1 /你好%20world“)。

接下来的事情是定义一个模型和控制器:

// /Models/BlogPost.cs 
public class BlogPost 
{ 
    public string Heading { get; set; } 
    public string Text { get; set; } 
} 

// /Controllers/PostsController 
public class PostsController : Controller 
{ 
    public ActionResult Details(string id) 
    { 
     BlogPost model = GetModel(id); 

     if (model == null) 
      return new HttpNotFoundResult(); 

     return View(model); 
    } 

    private BlogPost GetModel(string blogPostId) 
    { 
     // Getting blog post with the given Id from the database 
    } 
} 

最后,这是你的看法(/Views/Posts/Details.cshtml)应该如何看起来像:

@model [Root namespace].Models.BlogPost; 

<article> 
    <h2>@Model.Heading</h2> 
    <p>@Model.Text</p> 
</article> 

希望这为你澄清了一些事情。

1

您将为您的操作方法指定一个实际博客文章的参数。

因此,例如:

/post/view/123 

会查看博客文章ID为123.您对PostController的动作看起来就像

ViewResult View(int postId){ 
    //get from db, return appropriate content via view here 
} 

所以,你只需要一个控制器,并且在这个例子中一个动作做这一切。只是参数改变。

+0

和客户的uri(像每个问题一样的stackoverflow)? – 2013-03-16 11:18:19

+0

您会注意到,如果您删除SO URL的最后一位(离开int ID),它仍然有效。最后一点主要是在那里搜索引擎优化,并没有对路由的影响。为了在自己的应用中制作类似的功能,您需要在路由中使用通配符。请参阅此问题中的{* pathInfo}位以了解如何完成:http://stackoverflow.com/questions/10344986/mvc3-routing-basics。请注意,如果您只输入int id位,则会将您重定向到完整的URL。它根据int id从数据库中获得标题,并进行重定向。这样就有了一个“规范”的url。 – Nik 2013-03-16 13:01:40