我对Web开发和asp.net mvc都很陌生,我正在尝试创建一个博客作为我的第一个项目。如何使用自定义动作在asp.net中生成自定义网址mvc
现在,在博客中每个帖子都有自己的页面(有点像每个问题有一个新页面的stackoverflow)的规范。但我很难理解我将如何实现这一目标。
因为例如每个新页面都必须有自己的视图和自己的操作方法。现在假设有1000个博客帖子,这意味着动态创建控制器中的1000个视图和1000个动作。
当然必须有其他方法。在这个问题上的一点指导将有助于很多。
我对Web开发和asp.net mvc都很陌生,我正在尝试创建一个博客作为我的第一个项目。如何使用自定义动作在asp.net中生成自定义网址mvc
现在,在博客中每个帖子都有自己的页面(有点像每个问题有一个新页面的stackoverflow)的规范。但我很难理解我将如何实现这一目标。
因为例如每个新页面都必须有自己的视图和自己的操作方法。现在假设有1000个博客帖子,这意味着动态创建控制器中的1000个视图和1000个动作。
当然必须有其他方法。在这个问题上的一点指导将有助于很多。
您将只有一个操作和一个视图,但不同的博客文章有不同的数据(视图模型)。因此,举例来说,假设你声明一个特殊的路径为您的博客帖子:
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>
希望这为你澄清了一些事情。
您将为您的操作方法指定一个实际博客文章的参数。
因此,例如:
/post/view/123
会查看博客文章ID为123.您对PostController的动作看起来就像
ViewResult View(int postId){
//get from db, return appropriate content via view here
}
所以,你只需要一个控制器,并且在这个例子中一个动作做这一切。只是参数改变。
和客户的uri(像每个问题一样的stackoverflow)? – 2013-03-16 11:18:19
您会注意到,如果您删除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