RenderAction调用错误的动作方法

时间:2010-11-19 17:57:41

标签: asp.net-mvc asp.net-mvc-3 renderaction

我正在努力渲染渲染,问题是它在我的控制器上调用了错误的动作方法。

在我的“用户”控制器上有两种叫做编辑的动作方法,一种用于获取,一种用于发布请求:

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 MVC 3 RC以防万一。

谢谢,

阿德里安

4 个答案:

答案 0 :(得分:12)

子操作使用其父操作的HTTP方法

问题是您的视图是在回发操作后呈现的。视图中的所有子操作渲染都使用相同的HTTP方法。所以POST正在被复制。我不确定MVC3,但在MVC2中没有内置的方法可以解决这个问题。

所以问题是你希望你的Edit()动作在POST视图中呈现为GET。盒子外面。没办法。

您当然可以通过提供自己的功能=类来实现。

答案 1 :(得分:2)

这甚至不会编译:

public virtual ActionResult Edit(UserViewModel model) {}

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

在同一个类中,不能有两个具有相同名称和相同参数的方法。为什么你的行为是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" });}

答案 2 :(得分:0)

我不是100%确定它是否可用于MVC3,但在MVC2(使用MvcFutures:Microsoft.Web.MVC)中我会使用:

Html.RenderAction<UsersController>(c => c.Edit(666));

答案 3 :(得分:0)

我知道这是非常古老的,我们现在正在使用MVC5 - 但这仍然是运行Html.RenderAction()时出现的行为。

我对这个特定情况的解决方案是在我的[HttpPost]操作中检查我的视图模型上的值,如果它们为null(或其他)我调用了return Edit(),如果他们不是我叫AntiForgery.Validate()来正确验证令牌。