【问题标题】:After the modal is closed render the data on a different partial view模式关闭后,在不同的局部视图上呈现数据
【发布时间】:2015-07-15 00:55:59
【问题描述】:

我已经查看了许多示例,但仍然无法使其发挥作用。

我试图在模式关闭后返回数据对象以显示在不同的局部视图上而不刷新页面。

@using (Html.BeginForm("CreateWebOrder", null, FormMethod.Get))
{
    <div class="row">
        <div class="col-lg-6">

            @*//@Html.Partial("_DisplayShipToInfo", Model)*@

            @if (Model.Ship_To_Name == null && Model.WebOrderDetails.Count == 0)
            {
                <div class="pull-left col-lg-1">
                    <a class="btn btn-success" data-modal="" href="/WebOrder/CreateShipTo" id="btnCreate">
                        <span class="glyphicon glyphicon-plus"></span>
                    </a>
                </div>
                  **<div id="partialDiv">
                     @Html.Partial("_DisplayShipToInfo", Model)
                  </div>**
            }
            else
            {
                @Html.Partial("_DisplayShipToInfo", Model)
            }
        </div>

        <div class="col-lg-6" data-posey-ajax="true" data-posey-target="#DisplayBillToInfo">
            @Html.Partial("_DisplayBillToInfo", Model)
        </div>
    </div>
}

我创建了一个局部视图“_AddShipToInfo”来添加数据。

我还有另一个用于显示数据的局部视图“_DisplayShipToInfo”。

显示部分视图“_DisplayShipToInfo”包含以下内容:

@model PoseySqlApp.ViewModels.WebOrderVM

<div>
    <div>
        @Html.DisplayFor(model => model.Ship_To_Name)
    </div>
    <div>
        @Html.DisplayFor(model => model.Ship_To_Address_1)
    </div>
    <div>
        @Html.DisplayFor(model => model.Ship_To_Address_2)
    </div>
    <div>
        @Html.DisplayFor(model => model.Ship_To_City_Name)
        @Html.DisplayFor(model => model.Ship_To_State_Code)
        @Html.DisplayFor(model => model.Ship_To_Zip_Code)
    </div>
</div>

控制器动作正在返回数据对象。

    public async Task<JsonResult> Create(WebOrderVM webOrderVM)
    {
        if (ModelState.IsValid)
        {

            Mapper.CreateMap<WebOrder, WebOrderVM>();

            WebOrder webOrder = Mapper.DynamicMap<WebOrder>(webOrderVM);

            db.WebOrders.Add(webOrder);
            await db.SaveChangesAsync();
            return Json(new {webOrder, success = true });
        }

        return Json(webOrderVM, JsonRequestBehavior.AllowGet);
    }

如何获取数据对象以从 jquery 呈现部分视图“_DisplayShipTo”。

jQuery

function bindForm(dialog) {
    $('form', dialog).submit(function () {
        $('#progress').show();
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (result) {
                if (result.success) {
                    $('#myModal').modal('hide');
                    $('#progress').hide();
                    **$("#partialDiv").html(result)**
                    location.reload();
                } else {
                    $('#progress').hide();
                    $('#myModalContent').html(result);
                    bindForm();
                }
            }
        });
        return false;
    });

【问题讨论】:

  • 你能解释一下为什么你的'Create'控制器方法返回'JsonResult'而不是'PartialResult'吗?我最近通过从 'Html.BeginForm' 切换到 'Ajax.BeginForm' 然后在 'this.Request.IsAjaxRequest' == 'true' 时返回 'PartialResult' 来实现类似的行为。
  • 这应该是 ActionResult 而不是 JsonResult

标签: jquery json asp.net-mvc viewmodel partial-views


【解决方案1】:

我认为最简单的方法是切换到'Ajax.BeginForm',然后按以下方式编写'Create'方法:

public async Task<ActionResult> Create(WebOrderVM webOrderVM)
{
    if (ModelState.IsValid)
    {
        Mapper.CreateMap<WebOrder, WebOrderVM>();

        WebOrder webOrder = Mapper.DynamicMap<WebOrder>(webOrderVM);

        db.WebOrders.Add(webOrder);
        await db.SaveChangesAsync();
    }

    if (this.Request.IsAjaxRequest)
        return PartialView("~/Views/Orders/Partial/_DisplayShipToInfo.cshtml", webOrderVM);
    else
        return View("OrderPage", webOrderVM);
}

“Ajax.BeginForm”是这样的:

@using (Ajax.BeginForm(
    "Create", "WebOrder", null,
    new AjaxOptions {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "partialDiv",
        OnBegin = function () { /* show progress dialog */ },
        OnComplete = function () { /* hide progress dialog */ }
    }))
{
    ...
    <div id="partialDiv">
        <!-- ajax result rendered here -->
    </div>
    ...
}

这是因为“Ajax.BeginForm”以“_DisplayShipToInfo”为目标,所以当“POST”返回时,渲染的“div”标签将被替换。

注意:您必须包含“jQuery.unobtrusive-ajax.js”才能使“Ajax.BeginForm”工作。

【讨论】:

  • 嗨 karmasponge... 我不想改变这个。我几乎有这个工作。问题与页面刷新有关。我只需要刷新 _DisplayShipTo 部分视图。
  • RThomspon,我已经更新以更好地反映您的具体问题
  • 嗨 karmasponge,我真的很感谢你帮助我。好吧,它可以工作,但不是我希望它如何工作。在主视图上,我有一个按钮。当用户单击按钮时,模式显示“_AddShipToInfo”部分视图。我要做的是替换用户单击以显示模式的按钮,并将该按钮替换为“_DisplayShipTo”部分视图。你给我的例子显示了一个模态的“_DisplayShipTo”部分视图。
  • 模式关闭后。如何将 _DisplayShipTo 放在按钮的同一个位置。
    @Html.Partial("_DisplayShipToInfo", Model)
  • 对不起,我是想早点更新的。只需将“UpdateTargetId”更改为“partialDiv”或您想要的任何元素的“id”,“Ajax.BeginForm”就会将该元素替换为返回的 HTML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2016-06-22
  • 2012-07-21
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多