6

私はrenderactionに苦労しています。問題は、コントローラーで間違ったアクションメソッドを呼び出すことです。

私の「ユーザー」コントローラーには、編集と呼ばれる2つのアクションメソッドがあります。1つはget用、もう1つはpostリクエスト用です。

public virtual ActionResult Edit(int id)
{
 //return a view for editing the user
}


[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model)
{
 //modify the user...
}

私の見解では、Renderactionを次のように呼んでいます。

Html.RenderAction("Edit", "Users", new { id = 666});

ここで問題となるのは、GETアクションメソッドをレンダリングしたいということです。ただし(おそらくモデルにIDというプロパティも含まれているためですか?)、Renderactionは代わりにPOSTアクションメソッドを呼び出します。

これを行うための適切な方法は何ですか?重要な場合に備えて、ASP.NET MVC3RCを使用しています。

ありがとう、

エイドリアン

4

4 に答える 4

12

サブアクションは、その親アクションのHTTPメソッドを使用します

問題は、ポストバックアクションの後にビューがレンダリングされていることです。ビュー内のすべてのサブアクションレンダリングは、同じHTTPメソッドを使用します。そのため、POSTはそれらに複製されています。MVC3についてはよくわかりませんが、MVC2には、この問題を克服するための組み込みの方法がありませんでした。

したがって、問題は、Edit()アクションをPOSTビューでGETとしてレンダリングする必要があることです。箱から出して。とんでもない。

もちろん、独自の機能=クラスを提供することでそれを行うことができます。

于 2010-11-19T21:03:49.107 に答える
2

これはコンパイルすらしません:

public virtual ActionResult Edit(UserViewModel model) {}

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model) {}

同じクラスに同じ名前と同じ引数を持つ2つのメソッドを含めることはできません。また、なぜあなたの行動はvirtual


アップデート:

再現できません。これは当てはまらないようです:

public class UserViewModel
{
    public int Id { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Edit(int id)
    {
        return View(new UserViewModel());
    }

    [HttpPost]
    public ActionResult Edit(UserViewModel model)
    {
        return View(model);
    }
}

そして、Index.cshtmlレンダリングでは、編集アクションは正しい編集アクション(idパラメーターを持つアクション)を呼び出します。

@{Html.RenderAction("edit", "home", new { id = "123" });}
于 2010-11-19T18:03:08.373 に答える
0

これがMVC3で利用可能かどうかは100%わかりませんが、MVC2(MvcFutures:Microsoft.Web.MVCを使用)では次を使用します。

Html.RenderAction<UsersController>(c => c.Edit(666));
于 2010-11-19T19:50:58.953 に答える
0

これは非常に古いことを知っており、現在MVC5を使用していますが、これは実行時に表示される動作Html.RenderAction()です。

この特定のケースに対する私の解決策は[HttpPost]、ビューモデルの値についてアクションをチェックインし、それらがnull(またはその他)であるかどうかを確認し、そうでない場合はトークンを適切に検証するためreturn Edit()に呼び出しました。AntiForgery.Validate()

于 2017-03-16T23:07:40.790 に答える