通过 jquery ajax 更新 viewModel

发布于 2024-11-04 19:58:33 字数 1533 浏览 6 评论 0原文

我想使用 asp.net mvc 实现一个产品。
我的产品分为几个模块,我想使用 jquery 选项卡小部件来指导用户完成提交。
我的 ProductController 将 viewModel 对象列表发送到产品视图。
所以我的产品视图是这样的:

@model IList<View.Products.Modules.IModuleView>

<script type="text/javascript">
    $(document).ready(function () {
        $("#tabs").tabs({ ajaxOptions:
            {
                type: 'POST', 
                cache: false
            }
        });
    });
</script>

<div id="tabs">
    <ul>
        <li><a href="#fragment-1"><span>Tab1</span></a></li>
        <li><a href="#fragment-2"><span>Tab2</span></a></li>
        <li>@Html.ActionLink("Result","Result","Product")</li>
    </ul>
    <div id="fragment-1">
        @{
            var viewModelA = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelA)).First();
            var viewModelB = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelB)).First();
            var viewModelC = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelC)).First();
        }
        @Html.Partial("viewA", viewModelA)
        @Html.Partial("viewB", viewModelB)
        @Html.Partial("viewC", viewModelC)
    </div>
    <div id="fragment-2">
        Lorem ipsum dolor...
    </div>
</div>

到目前为止,一切都很好。当用户单击最后一个选项卡时,他会调用我的 ProductController 上的操作 Result。这是我的问题:收集部分视图的所有表单信息、将其发送回控制器并更新我的 viewModel 的最佳方法是什么?

感谢您的任何建议!

I'd like to implement a product using asp.net mvc.
My Product is devided in several modules and i want to use the jquery tab widget to guide the user trough the submission.
My ProductController sends a list of viewModel objects to the product view.
So my product view looks like this:

@model IList<View.Products.Modules.IModuleView>

<script type="text/javascript">
    $(document).ready(function () {
        $("#tabs").tabs({ ajaxOptions:
            {
                type: 'POST', 
                cache: false
            }
        });
    });
</script>

<div id="tabs">
    <ul>
        <li><a href="#fragment-1"><span>Tab1</span></a></li>
        <li><a href="#fragment-2"><span>Tab2</span></a></li>
        <li>@Html.ActionLink("Result","Result","Product")</li>
    </ul>
    <div id="fragment-1">
        @{
            var viewModelA = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelA)).First();
            var viewModelB = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelB)).First();
            var viewModelC = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelC)).First();
        }
        @Html.Partial("viewA", viewModelA)
        @Html.Partial("viewB", viewModelB)
        @Html.Partial("viewC", viewModelC)
    </div>
    <div id="fragment-2">
        Lorem ipsum dolor...
    </div>
</div>

So far, so good. When the user clicks on the last tab he invokes the action Result on my ProductController. And here is my Question: What is the best way to collect all form information of my partial views, send it back to the controller and update my viewModels?

Thanks for any suggestions!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扛刀软妹 2024-11-11 19:58:33

这是我当前的解决方案:
(我的模块共享一种表单,Presenter 对象存储在会话中)

jQuery:

    $('#tabs').bind('tabsselect', function (event, ui) {
        var formToSubmit = $('form:first');
        var jqxhr = $.post(formToSubmit.attr('action'), formToSubmit.serialize(),
            function ShowResult(data) {
                $("#fragment-2").html( data );
            }
        );
    });

控制器:

    [HttpPost]
    public ActionResult Result(FormCollection form) 
    {
        viewModelA = (ViewModelA)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelA)).First();
        viewModelB = (ViewModelB)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelB)).First();

        TryUpdateModel<ViewModelA>(viewModelA, form);
        TryUpdateModel<ViewModelB>(viewModelB, form);

        TransactionResult result = Presenter.CheckBusinessRules(true);

        if (result.IsDirty)
        {
            return Content( result.Message);
        }

        return PartialView();
    }

This is my current solution:
(my modules share one form and the Presenter object is stored in the session)

the jQuery:

    $('#tabs').bind('tabsselect', function (event, ui) {
        var formToSubmit = $('form:first');
        var jqxhr = $.post(formToSubmit.attr('action'), formToSubmit.serialize(),
            function ShowResult(data) {
                $("#fragment-2").html( data );
            }
        );
    });

the Controller:

    [HttpPost]
    public ActionResult Result(FormCollection form) 
    {
        viewModelA = (ViewModelA)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelA)).First();
        viewModelB = (ViewModelB)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelB)).First();

        TryUpdateModel<ViewModelA>(viewModelA, form);
        TryUpdateModel<ViewModelB>(viewModelB, form);

        TransactionResult result = Presenter.CheckBusinessRules(true);

        if (result.IsDirty)
        {
            return Content( result.Message);
        }

        return PartialView();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文