首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从子动作调用后ViewModel消失

从子动作调用后ViewModel消失
EN

Stack Overflow用户
提问于 2017-10-06 03:28:38
回答 3查看 60关注 0票数 0

我有以下情况:

  • 用户可以在订单上发布评论。
  • 要显示注释表单,我将在订单的@{Html.RenderAction("CreateComment", "Order", new { orderId = Model.Id, orgId = Model.OrganisationId });}视图上调用Details
  • 一旦用户发布他们的评论,我需要重定向回订单的Details视图
  • 但是,当调用RedirectToAction时,我得到: 不允许子操作执行重定向操作。

为了解决这个问题,我尝试调用Redirect的insead

代码语言:javascript
运行
复制
return View("Details", new { id = viewModel.OrderId });

但现在我看到了这个奇怪的错误:

传递到字典中的模型项的类型是‘<>f_AnonyousType4’1System.Int 32‘,但是该字典需要一个类型为'ViewOrderViewModel’的模型项。

这似乎是在抱怨我没有把ViewModel传递到视图中。

但是,如果您查看我正在调用的Details控制器操作,它实际上接受一个int并在那里构建ViewModel (我可以看到,在进行上述更改后,这个操作仍然被击中):

代码语言:javascript
运行
复制
public ActionResult Details(int id)
{
    var orderViewModel = orderManager.Select(id);
    return View(orderViewModel);
}

这里发生什么事情?为什么我不能像通常那样使用id路由值调用操作呢?我的ViewOrderViewModel怎么了

如有任何建议,敬请见谅。

更新以添加代码

阶Details.cshtml

这就是我正在驱散comments表单的地方,也是我需要在这一切结束时重定向的地方。url看起来像loks ~/order/details/14

错误似乎是在行@{Html.RenderAction("CreateComment", "Order", new { orderId = Model.Id, orgId = Model.OrganisationId });}上抛出的。

不允许子操作执行重定向操作。

代码语言:javascript
运行
复制
@using Web.Resources.Headers

@model Web.Models.ViewOrderViewModel

<div class="container">
    <h4>@Model.Name</h4>
    <hr />
    <div class="col-xs-12">

        <h4>Comments</h4>
        <hr />

        <div class="col-xs-12 col-sm-6">
            @foreach (var comment in Model.Comments)
            {
                @comment.Content
            }
        </div>

        <div class="col-xs-12 col-sm-6">
            @{Html.RenderAction("CreateComment", "Order", new { orderId = Model.Id, orgId = Model.OrganisationId });}
        </div>
    </div>
</div>

CreateComment.cshtml

发表评论的表格

代码语言:javascript
运行
复制
@using Microsoft.AspNet.Identity

@model Web.Models.NewCommentViewModel

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        @Html.HiddenFor(model => model.OrderId)
        @Html.HiddenFor(model => model.OrganisationId)
        @Html.HiddenFor(model => model.UserId)

        <div class="form-group has-feedback">
            <div class="col-xs-12" style="padding:0px;">
                @Html.TextAreaFor(model => model.Content, new { @class = "form-control", placeholder = Html.DisplayNameFor(model => model.Content) })
                <span class="glyphicon glyphicon-option-horizontal form-control-feedback"></span>
            </div>
        </div>

        <div class="form-group">
            <div class="pull-right">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

OrderController

在这里,您可以看到用于删除注释表单并将注释发布到数据库中的控制器方法(“重定向”方法失败,与子操作的错误相同):

代码语言:javascript
运行
复制
public ActionResult CreateComment(int orderId, int orgId)
{
    var viewModel = new NewCommentViewModel()
    {
        OrderId = orderId,
        OrganisationId = orgId,
        UserId = User.Identity.GetUserId()
    };
    return PartialView(viewModel);
}

[HttpPost]
public ActionResult CreateComment(NewCommentViewModel viewModel)
{
    orderManager.AddComment(viewModel);
    return RedirectToAction("Details", new { id = viewModel.OrderId });
    //return Redirect($"/Order/Details/{viewModel.OrderId}");
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-06 04:24:58

首先,尝试将部分视图形式的BeginForm设置为包含控制器和动作方法名称的POST HTTP方法,如下所示:

代码语言:javascript
运行
复制
@using (Html.BeginForm("CreateComment", "Order", FormMethod.Post))
{
    // view controls
} 

还可以尝试分配GET操作方法,其名称与POST操作方法名称不同,并包括如下所示的ChildActionOnlyAttribute

代码语言:javascript
运行
复制
[ChildActionOnly]
public ActionResult RenderCreateComment(int orderId, int orgId)
{
    var viewModel = new NewCommentViewModel()
    {
        OrderId = orderId,
        OrganisationId = orgId,
        UserId = User.Identity.GetUserId()
    };
    return PartialView(viewModel);
}

然后在RenderAction中分配重命名的操作。

代码语言:javascript
运行
复制
@{Html.RenderAction("RenderCreateComment", "Order", new { ... });}

注意,一个子操作应该填充或获取数据,它不应该试图更新其他内容。

类似问题:

Child actions are not allowed to perform redirect actions

Child actions are not allowed to perform redirect actions MVC4

票数 1
EN

Stack Overflow用户

发布于 2017-10-06 04:18:27

@{Html.RenderAction("CreateComment", ...);}可能会调用您的重载。

尝试重命名:

代码语言:javascript
运行
复制
public PartialViewResult _CreateComment(int orderId, int orgId)
{
    var viewModel = new NewCommentViewModel()
    {
        OrderId = orderId,
        OrganisationId = orgId,
        UserId = User.Identity.GetUserId()
    };
    return PartialView(viewModel);
}

并打电话:

代码语言:javascript
运行
复制
@{Html.RenderAction("_CreateComment", ...);}
票数 1
EN

Stack Overflow用户

发布于 2017-10-06 04:25:48

问题是,您的表单是从子操作生成的,并且检查html中的<form>元素,您将看到它生成了action="/order/details/14",而它需要是action="/order/CreateComment"

您需要更改BeginForm()方法以生成正确的属性,以便将其发布到正确的方法。在CreateComment.cshtml视图中

代码语言:javascript
运行
复制
@model Web.Models.NewCommentViewModel
@using (Html.BeginForm("CreateComment", "Order")) // change
{
    @Html.AntiForgeryToken()
    ....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46597829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档