如何在asp.net mvc中使用自定义操作生成自定义URL

时间:2013-03-16 11:11:41

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我是Web开发和asp.net mvc的新手,我正在尝试创建一个博客作为我的第一个项目。

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

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

当然必须有其他方法。在这个问题上的一点指导会有所帮助。

2 个答案:

答案 0 :(得分:2)

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

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

这里我指定了一个名为title的附加网址参数,以使网址更具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>

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

答案 1 :(得分:1)

您的操作方法会有一个参数来标识实际的博文。

例如:

/post/view/123

会查看ID为123的博文。您对PostController的操作看起来像

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

所以你只需要一个控制器,在这个例子中有一个动作就可以做到这一切。只是参数更改。