【问题标题】:How to call controller method and pass the object from ajax call in ASP.Net MVC如何在 ASP.Net MVC 中调用控制器方法并从 ajax 调用传递对象
【发布时间】:2017-01-17 19:22:38
【问题描述】:

我正在学习并致力于 ASP.net MVC 5 项目。所以,我有一个模型视图,其中包含其他模型视图。

父模型视图

public class FullConfigMV
{
 some properties here
 public ElementStyleMV Page { get; set; }
}

现在下面是我想要实现的目标。

  1. 进行 ajax 调用

  2. 一旦 ajax 调用命中控制器函数,设置一些值

  3. 现在我需要将该对象传递给另一个控制器操作,该操作将返回它的视图。

第 1 步。

<script>
    $(document).ready(function()
    {
        $("#tan").change(function()
        {
            alert(this.value);
            $.ajax({
                type: 'POST',
                url: '/Settings/GetAvailableLocationsFor',
                data: { accountId: 28462, groupId: 35},
                success: function (data) {
                    //Whatever
                },
                error: function () {
                    DisplayError('Failed to load the data.');
                }
            });


        });
    });
</script>

在第 1 步之后,我的断点在

public ActionResult GetAvailableLocationsFor(int accountId, int groupId)
        {
            FullConfigMV configData = SetLoader.GetDSettings(accountId, groupId);
            Utils.SiteCss = configData.CssStyles();
           // NOW AT THIS PLACE I WANT TO CALL ANOTHER CONTROLLER FUNCTION
           // AND PASS THE `configData Obj`
            return View();
        }

我知道我们有类似的东西

return RedirectToAction("Index","Home"); 

但是如何通过config Obj

我要调用的控制器函数在 Home Controller,动作名称为Index

public ActionResult Index(FullConfigMV data)
        {
            return View();
        }

如果要求看起来很奇怪,请对此承担/幽默。

编辑

在解决方案建议“使用TempData”之后,但问题是我的控制器中有两个索引操作。我希望SECOND 索引操作受到打击。但是第一个被击中了。

第一:

public ActionResult Index()
{
}

第二

[HttpPost]
public ActionResult Index(FullConfigMV data)
{
} 

使用的代码是

    public ActionResult GetAvailableLocationsFor(int accountId, int groupId)
    {
        FullConfigMV configData = SetLoader.GetDSettings(accountId, groupId);
        SimUtils.SiteCss = configData.CssStyles();
        TempData["config"] = configData;
        return RedirectToAction("Index", "Home");
    }

【问题讨论】:

  • 要在 RedirectToAction 调用之间传递对象,请使用 Session 或 TempData。如果您只需要其他控制器操作的(非视图)结果 - 您将该代码移动到一个新类中,以便任何控制器都可以获得结果。
  • 请不要在您的问题中使用每个版本标签。您说过您使用的是第 5 版;使用该版本标签。这次我已经为你编辑了。
  • @MikeMcCaughan:谢谢。我会从下一次开始照顾它。
  • 你的GetAvailableLocations有视图,还是用来处理数据的?
  • 它不需要视图。只是为了处理数据。

标签: c# asp.net-mvc asp.net-mvc-5


【解决方案1】:

您可以使用 TempData 实现此目的。来自https://msdn.microsoft.com/en-us/library/system.web.mvc.tempdatadictionary(v=vs.118).aspx

“TempDataDictionary 对象的典型用途是在重定向到另一个操作方法时从操作方法传递数据。”

那里有很多文档,但只需使用

TempData["config"] = configData;

在您的第一个 actionresult 中,并在您的 Home> 索引中检索它

var configData = TempData["config"] as FullConfigMV;

【讨论】:

  • 那么我应该如何调用homecontroller的索引。 return redirectoaction("Index", "home")?
  • 是的,这将与 TempData 一起使用,它会为当前和下一个请求保留它。
【解决方案2】:

对此我不是 100%,但您可能可以将其作为路线传递。如果没有,请使用 TempData

例子:

public ActionResult GetAvailableLocationsFor(int accountId, int groupId)
{
    FullConfigMV configData = SetLoader.GetDSettings(accountId, groupId);
    Utils.SiteCss = configData.CssStyles();
    return RedirectToAction("Index","Home", new { data = configData});
}

或者如果上述方法不起作用:

public ActionResult GetAvailableLocationsFor(int accountId, int groupId)
{
    FullConfigMV configData = SetLoader.GetDSettings(accountId, groupId);
    Utils.SiteCss = configData.CssStyles();
    TempData["config"] = configData;
    return RedirectToAction("Index","Home");
}

// Index ActionResult

public ActionResult Index()
{
    if (TempData["config"] != null)
    {
        FullConfigMV variableName = (FullConfigMV)TempData["config"];
        ...
        return View(/*whatever you want here*/);
    }

    return View();
}

如果有帮助请告诉我

【讨论】:

  • 我会试试这个解决方案。但是我已经完成了发布的其他解决方案的一半。我已经进行了编辑。能不能看一次。我被困在一个地方。
  • 我想点击接受参数的 INDEX 函数。不是空的。
  • GetAvailableLocationsFor 是否与Index 在同一个控制器中?
  • 不。 GetAvailableLocationsForsettingsController 中,在家庭控制器中,我有两个名称为索引的动作。我添加了 GetAvailableLocationsFor 的返回语句的编辑
  • 所以,homecontroller 有两个 Index Action。
【解决方案3】:

关于你的问题 解决方案后建议“使用 TempData” 但问题是我的控制器中有两个索引操作。我希望 SECOND Index Action 受到打击。但是第一个受到打击您可以做的是基于您可以在 TempData 中设置的一些数据,您可以从您的第一个索引方法调用return Index(data),您可以通过 data临时数据或其他一些变量。这将通过第一个索引方法调用您的第二个索引方法。

【讨论】:

  • 我在我想要点击的参数化索引 Action 的顶部添加了这个 `[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]`。它正在工作。非常感谢您的建议..
猜你喜欢
  • 2014-06-17
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多