我是 Web 开发和 asp.net mvc 的新手,我正在尝试创建一个博客作为我的第一个项目。
现在,在博客中,每篇文章都有自己的页面(有点像 stackoverflow 为每个问题都有一个新页面)。但我很难理解我将如何实现这一目标。
因为例如每个新页面都必须有自己的视图和自己的操作方法。现在假设如果有 1000 篇博文,这意味着控制器中有 1000 个视图和 1000 个动作是动态创建的。
肯定还有别的办法。在这个问题上的一点指导会很有帮助。
我是 Web 开发和 asp.net mvc 的新手,我正在尝试创建一个博客作为我的第一个项目。
现在,在博客中,每篇文章都有自己的页面(有点像 stackoverflow 为每个问题都有一个新页面)。但我很难理解我将如何实现这一目标。
因为例如每个新页面都必须有自己的视图和自己的操作方法。现在假设如果有 1000 篇博文,这意味着控制器中有 1000 个视图和 1000 个动作是动态创建的。
肯定还有别的办法。在这个问题上的一点指导会很有帮助。
您将只有一个操作和一个视图,但针对不同的博客文章有不同的数据(视图模型)。因此,例如,假设您为博客文章声明了一条特殊路线:
routes.MapRoute(
"BlogPostDetails",
"posts/{id}/{title}",
new { controller = "Posts", action = "Details" }
);
在这里,我指定了一个额外的 URL 参数,称为title
使 URL 对 SEO 更友好(例如“/posts/1/Hello%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
}
因此,您只需要一个控制器和本示例中的一个操作即可完成所有这些操作。只是参数变化。