【问题标题】:Post json object to controller and get view将 json 对象发布到控制器并获取视图
【发布时间】:2016-09-21 23:13:24
【问题描述】:

我正在尝试将数据发布到同一控制器中的不同操作。这些天我使用表单提交或带有查询参数的 url,我现在的情况是不同的:

要求:在其中一个视图中,我们有一些下拉菜单、文本框和动态生成的 div(Tiles),每个 div 都是可点击的,现在当用户单击 div(Tile)时,将调用 javascript 函数来获取下拉控件的值,文本框值,现在我需要将该数据发布到同一个控制器中的不同操作(比如说 actionMethod2)并显示它返回的任何视图,我该怎么做?

我尝试使用 ajax post 方法,但意识到我无法移动到该 actionMethod2 返回的视图。 我试图做一个简单的 window.location 但我也需要发布这些值......

这里是javascript:

    var searchModel = {};
    searchModel.StartDate = $('#dvSearchDateRange').attr('data-startDt');
    searchModel.EndDate = $('#dvSearchDateRange').attr('data-endDt');
    searchModel.Status = propertyName;
    searchModel.StatusText = tileText;
    searchModel.AgencyId = cascadOADdropdowns.selectedAgencyId;
    searchModel.DeptId = cascadOADdropdowns.selectedDeptId;
    searchModel.AgencyName = cascadOADdropdowns.selectedAgencyName;
    searchModel.DeptName = cascadOADdropdowns.selectedDeptName;
    $.ajax({
        url: referralSearchUrl, // /Home/ReferralsList'
        type:"POST",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(searchModel)
    });

这在技术上是可行的,但这不是我想要的,我需要显示 action 方法返回的整个视图(就像你从 url 调用一样)。

HomeController:
//this method provides data to dynamically generate divs. You can consider this as user's landing view(Page)
    public ActionResult Index(DashboardSearchViewModel vm)
    {
        //VMs
        UserInfoViewModel userInfoVM = MySession.GetSession<UserInfoViewModel>(Constants.USER_INFO);
        LookupsViewModal lookupsVM = new LookupsViewModal();
        //DAL, BAL
        DashboardBA dashboardBA = new DashboardBA();
        LookupsBA lookupsBA = new LookupsBA();

        vm.SearchStartDate = DateTime.Now.AddMonths(-dateRange);
        vm.SearchEndDate = DateTime.Now;
        lookupsVM.AgencyId = vm.AgencyID = userInfoVM.UserInforFromES.AgencyID;
        lookupsVM.DeptId = vm.DepartmentID = userInfoVM.UserInforFromES.DeptID;
        lookupsVM.OrgId = userInfoVM.UserInforFromES.OrgID;
        lookupsVM.logonId = userInfoVM.LogonID;
        vm.LoggedInUserInformation = userInfoVM;
        vm = dashboardBA.GetDashboardSummary(vm);

        lookupsVM = lookupsBA.GetLookups(lookupsVM);

        TempData[Constants.LOOKUPS] = lookupsVM;
        return View(vm);
    }

    /*This is the action method i need to post values to and display returned view.Its like submitting data by user and redirect user to different view (by server)*/

    public ActionResult ReferralsList(ReferralSearchFilersViewModel searchValues)
    {
      return View(vm);
    }

【问题讨论】:

  • ajax 的全部意义在于保持在同一页面上。如果您想将用户重定向到不同的视图,请不要使用 ajax。只需进行正常提交即可。
  • @Stephen:你说得对,我不应该使用 Ajax。但是我需要在使用 javascript 显示的页面上收集一些数据并将其提交给控制器,然后控制器将我重定向到不同的视图。现在我不确定我们是如何做到的,我们在这里没有使用任何形式....
  • 但是为什么不添加&lt;form&gt;标签呢?
  • 我正在显示的内容是使用 jquery 调用和一些前端工具动态显示的。当用户单击其中一个 div 时,我需要获取一些值(基于用户单击的 div)并将它们发布到服务器,如果服务器端一切正常,则操作方法将重定向其他,它将发送错误消息.
  • 您对此的看法:您发送 ajax 请求,如果它完成且没有错误,则将用户重定向到另一个视图(类似于 window.location = '/controller/action' 之类的东西)。否则你会向用户显示一些错误?

标签: asp.net asp.net-mvc asp.net-mvc-4 c#-4.0 devextreme


【解决方案1】:

更改您的操作以返回 PartialViewResult。您可能需要在部分剃刀视图中设置@{ Layout = null }

在您的 JQuery ajax 调用的 success 回调中,使用部分结果在您的页面上填充一些 &lt;div&gt;。例如

$.ajax({
    url: referralSearchUrl, // /Home/ReferralsList'
    type:"POST",
    contentType: "application/json",
    dataType: "json",
    data: JSON.stringify(searchModel),
    success: function(partial) {
        $('#SomeDiv').html(partial);
    }
});

【讨论】:

  • 在我们的例子中,我们需要显示包括布局在内的完整视图,因为返回的视图使用不同的布局和一堆 javascript 文件引用和一些图像。
  • 您是否将返回的视图嵌入到“父”视图中?您可以始终让 Action 返回一个 ActionResult(普通视图),并且您仍然会收到传递给成功回调的部分参数中的所有 html。
猜你喜欢
  • 2013-07-03
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多