0

私はブログアプリケーションを作成することにより、自分自身にasp.netmvc3を教えています。ただし、コメントのアップロードに問題があります。ユーザーがコメントを残したときにすべてが機能するという点で、これは非常に微妙なエラーです。ただし、投稿のURLは変更されます。

したがって、ブログ投稿には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

私は知っています、今のところ、urlHeader情報を渡すRedirectToActionには何もありません。しかし、私は次のようないくつかのことを試しました:

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
        );
    }
4

1 に答える 1

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のフォームに非表示の入力を追加することもできます。このようにして、前の2つの更新を行う必要はありません。

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

いずれにせよ、Model.Blog.UrlHeaderがnullまたは空の文字列でないことを確認してください

于 2012-09-16T08:15:53.763 に答える