代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

RenderAction调用错误的操作方法

  •  6
  • Adrian Grigore  · 技术社区  · 14 年前

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

    在我的“用户”控制器上,有两个名为edit的操作方法,一个用于get,一个用于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 action方法。但是(可能是因为模型还包含一个名为ID的属性?),Renderaction改为调用我的POST action方法。

    正确的方法是什么?我用的是ASP.netmvc3rc,以防万一。

    谢谢,

    阿德里安

    4 回复  |  直到 14 年前
        1
  •  12
  •   Robert Koritnik    13 年前

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

    问题是,您的视图是在回发操作之后呈现的。视图中的所有子动作呈现都使用相同的HTTP方法。所以这篇文章被复制到他们身上。我不确定MVC3,但是在MVC2中没有内置的方法来解决这个问题。

    所以问题是你想 Edit() 作为后视图上的GET呈现的操作。开箱即用。不可能。

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

        2
  •  2
  •   Darin Dimitrov    14 年前

    这甚至无法编译:

    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" });}
    
        3
  •  0
  •   ARM    14 年前

    我不能百分之百确定这是否在MVC3中可用,但在MVC2中(使用MVC格式:Microsoft.Web.MVC)我将使用:

    Html.RenderAction<UsersController>(c => c.Edit(666));
    
        4
  •  0
  •   brazilianldsjaguar    8 年前

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

    我解决这个案子的办法是 [HttpPost] 对视图模型中的值执行操作,如果值为空(或其他值),则调用 return Edit() 如果不是我打电话给他们 AntiForgery.Validate() 以正确验证令牌。

    推荐文章