2012-09-15 100 views
0

我正在通過創建博客應用程序來教導自己的asp .net mvc3。不過,我有 評論上傳的問題。這是一個非常微妙的錯誤,因爲當用戶發表評論時,一切都可以正常工作。但是,帖子的網址發生了變化。添加評論並重定向回博客文章後URL參數丟失

因此,一個博客帖子有

http://localhost:49175/Blog/Details/3/Third-post 

這是通過URL路線圖這裏生成一個網址:

routes.MapRoute(
       "BlogDetail", // Route name 
       "Blog/Details/{id}/{urlHeader}", // URL with parameters 
       new { controller = "Blog", action = "Details", id = UrlParameter.Optional, urlHeader = UrlParameter.Optional } // Parameter defaults 
      ); 

現在,當用戶離開評論 - 他被引導到評論控制器:

[HttpPost] 
    public ActionResult Create(BlogDetailsViewModels viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       blogrepository.Add(viewModel.Comment); 
       return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID }); 
      } 
      catch (DataException) 
      { 
       ModelState.AddModelError("", "Unable to save comment. Try again, and if the problem persits then contact administrator."); 
      } 
     } 
     // If we got this far, something failed, redisplay form 
     return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID }); 
    } 
} 

然而,當有人評論 - 他被重定向回

http://localhost:49175/Blog/Details/3 

我知道,截至目前,RedirectToAction中沒有任何內容傳遞urlHeader信息。但是,我嘗試了幾件事情,例如:

return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID, urlHeader = viewModel.Blog.UrlHeader }); 

但是,它似乎不起作用。

這是博客的細節控制器:

// 
    // GET: /Blog/Details/5 
    public ViewResult Details(int id, string urlHeader) 
    { 
     var blogs = blogrepository.GetBlog(id); 
     var recentblogs = blogrepository.FindRecentBlogs(5); 
     var archivelist = blogrepository.ArchiveList(); 
     BlogDetailsViewModels viewModel = new BlogDetailsViewModels { Blog = blogs, RecentBlogs = recentblogs, ArchiveList = archivelist }; 
     return View(viewModel); 
    } 

我堅持對這個日子。

- 按要求全部的路由方法 -

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "BlogDetail", // Route name 
      "Blog/Details/{id}/{urlHeader}", // URL with parameters 
      new { controller = "Blog", action = "Details", id = UrlParameter.Optional, urlHeader = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
      "BlogArchive", // Route name 
      "Blog/{year}/{month}", // URL with parameters 
      new { controller = "Blog", action = "Archive" }, // Parameter defaults 
      new { year = @"\d{4}", month = @"\d{1,2}", } // Parameter constraints 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 
+0

你能顯示在Global.asax中完整的路線設置?你有其他路線設置? –

+0

根據要求更新 – Tripping

+0

@DarinDimitrov,當您直接在瀏覽器地址欄上顯示其示例時,此路線是否爲「Blog/Details/{id}/{urlHeader}」? –

回答

0

如果你的表單不包含數據viewModel.Blog.UrlHeader,這將是一個空字符串,即使viewModel.Blog可以爲null。

您可以將參數添加到您的文章操作方法,像這樣:

[HttpPost] 
public ActionResult Create(BlogDetailsViewModels viewModel, String urlHeader) 

而且,在你看來呈現形式,使用此代碼來生成表單元素:

@Html.BeginForm("Create","Blog",new{urlHeader=Model.Blog.UrlHeader}) 

或者,你可以在你的表單中爲urlHeader添加一個隱藏的輸入。這樣,您不必執行前兩次更新。

@Html.HiddenFor(m=>m.Blog.UrlHeader) 

無論哪種方式,請確保您的Model.Blog.UrlHeader不爲空或空字符串