English 中文(简体)
Action 和 prg 模式
原标题:send data between actions with redirectAction and prg pattern

如何将数据传送到 重新定向的行动之间? Action?

我用的是PRG模式,我想做类似的东西

[HttpGet]
    [ActionName("Success")]
    public ActionResult Success(PersonalDataViewModel model)
    {
        //model ko
        if (model == null)
            return RedirectToAction("Index", "Account");

        //model OK
        return View(model);
    }

    [HttpPost]
    [ExportModelStateToTempData]
    [ActionName("Success")]
    public ActionResult SuccessProcess(PersonalDataViewModel model)
    {

        if (!ModelState.IsValid)
        {
            ModelState.AddModelError("", "Error");
            return RedirectToAction("Index", "Account");
        }

        //model OK
        return RedirectToAction("Success", new PersonalDataViewModel() { BadgeData = this.GetBadgeData });
    }
最佳回答

当重定向时,您只能通过查询字符串值。不是整个复杂对象:

return RedirectToAction("Success", new {
    prop1 = model.Prop1,
    prop2 = model.Prop2,
    ...
});

这只使用 scalar 值。 所以, 您需要确保您在查询字符串中包含您需要的所有属性, 否则它会在重定向中丢失 。

另一个可能性是在服务器上某处(如数据库或某样东西)维持您的模型, 当重定向时只通过能检索模型的代号 :

int id = StoreModel(model);
return RedirectToAction("Success", new { id = id });

并在成功动作中检索模型回来:

public ActionResult Success(int id)
{
    var model = GetModel(id);
    ...
}

另一种可能性是使用 TempData ,尽管我本人不建议:

TempData["model"] = model;
return RedirectToAction("Success");

并在 cess action 从 TemmpData 获取它:

var model = TempData["model"] as PersonalDataViewModel;
问题回答

无法在使用对象的动作之间传递数据,正如Darin提到的那样,只能通过天平值。

如果您的数据太大, 或数据不只包含 scalar 值, 您应该这样做 。

[HttpGet]
public ActionResult Success(int? id)
{
    if (!(id.HasValue))
        return RedirectToAction("Index", "Account");

    //id OK
    model = LoadModelById(id.Value);
    return View(model);
}

通过 id < redent to Action < /code> < redentto Action > < redentto Action>

    return RedirectToAction("Success", { id = Model.Id });

重定向 ToAction 方法返回 < code> HTTP 302 对浏览器的反应, 使浏览器对指定动作做出 < code> GET 请求。 这样您无法通过复杂对象, 如您调用其他复杂对象的方法 。

您可能的解决方案是传递一个使用 GGet 动作的代号, 这样可以再次构建对象 。

[HttpPost]
public ActionResult SuccessProcess(PersonViewModel model)
{
  //Some thing is Posted (P) 
  if(ModelState.IsValid)
  {
    //Save the data and Redirect (R)
    return RedirectToAction("Index",new { id=model.ID时 时);
  时 时
  return View(model)
时 时

public ActionResult Index(int id)
{
  //Lets do a GET (G) request like browser requesting for any time with ID
  PersonViewModel model=GetPersonFromID(id);
  return View(id);
时 时

时 时

您可以将数据( 复杂对象) 保存到此邮政与使用会话获得请求之间( TemPData 内部甚至使用会话 ) 。 但我相信, 移除了 < 坚固 > PRG < / 坚固 > 模式的纯度 。





相关问题
Using jquery to get a partial view and updating the UI

I need to render a partial view (returned from the controller) to show some customer summary details. This will need to happen when the user clicks on a button. In the the mean time the user can ...

MVC 2 / MVC 3 / MVC 4

MVC 2 我们可以轻松地创造领域。 现在,我的问题涉及nes地区(地区内)。

Asp.Net MVC 2 - Changing the PropertyValueRequired string

Using a resx file in the App_GlobalResources directory, I ve been able to change the default message for the PropertyValueInvalid string of the model validators. But it doesn t work to translate the ...

ASP.NET MVC 3 - What features do you want to see? [closed]

I know a bunch of people that are really enjoying the improvements that ASP.NET MVC 2 made over the first release. I have just started to migrate our MVC 1 project over and so far areas has totally ...

热门标签