6

我正在为渲染操作而苦苦挣扎,问题是它在我的控制器上调用了错误的操作方法。

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

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

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) {}

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

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

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

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

我对这种特殊情况的解决方案是检查[HttpPost]我的视图模型上的值的操作,如果它们为空(或其他),我调用 my return Edit(),如果不是,我调用它们AntiForgery.Validate()以正确验证令牌。

于 2017-03-16T23:07:40.790 回答