我正在努力渲染渲染,问题是它在我的控制器上调用了错误的动作方法。
在我的“用户”控制器上有两种叫做编辑的动作方法,一种用于获取,一种用于发布请求:
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以防万一。
谢谢,
阿德里安
答案 0 :(得分:12)
问题是您的视图是在回发操作后呈现的。视图中的所有子操作渲染都使用相同的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()
来正确验证令牌。