我如何将一个模型与RedirectToAction结合起来?

 2023-02-17    423  

问题描述

在下面的RedirectToAction中,我想通过一个viewmodel.如何将模型传递给重定向?

我设置一个断点来检查模型值以验证模型是否正确创建.它是正确的,但结果视图不包含模型属性中找到的值.

我如何将一个模型与RedirectToAction结合起来?

//
// model created up here...
//
return RedirectToAction("actionName", "controllerName", model);

asp.net mvc 4 rc

推荐答案

RedirectToAction返回对客户端浏览器的302响应,因此浏览器将在响应的位置标题值中对URL进行新的Get请求来浏览器.

如果要将简单的lean-flat视图模型传递给第二个动作方法,可以使用此超载 RedirectToAction方法.

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    string controllerName,
    object routeValues
)

RedirectToAction将对象传递(rutevalues)转换为查询字符串并将其追加到URL(从我们传递的前两个参数生成),并将在 location 响应的标题.

让我们假设你的视图模型就像这个

public class StoreVm
{
    public int StoreId { get; set; }
    public string Name { get; set; }
    public string Code { set; get; } 
}

和您在第一个操作方法中,您可以将此对象传递给RedirectToAction方法,如此

var m = new Store { StoreId =101, Name = "Kroger", Code = "KRO"};
return RedirectToAction("Details","Store", m);

此代码将在浏览器中向浏览器发送302响应,其中位置标题值为

Store/Details?StoreId=101&Name=Kroger&Code=KRO

假设您的Details Action方法的参数是StoreVm,将QueryString Param值正确映射到参数的属性.

public ActionResult Details(StoreVm model)
{
  // model.Name & model.Id will have values mapped from the request querystring
  // to do  : Return something. 
}
TempData["NewCustomer"] = model;
return RedirectToAction("Index", "Users");

并再次在GET操作方法中读取它.

public ActionResult Index()
{      
  var model=TempData["NewCustomer"] as Customer
  return View(model);
}

TempData使用场景后面的Session对象来存储数据.但是一旦读取数据,数据就会终止.

Rachel写了一个很好的博客 post 解释何时使用tempdata/ViewData.值得读.

使用tempdata将模型数据传递到ASP.NET核心中的重定向请求

在ASP.NET核心中,您无法通过Tempdata的复杂类型.您可以通过string,int,Guid等的简单类型.

如果您绝对希望通过Tempdata传递复杂类型对象,则您有2个选项.

1)将您的对象序列化为字符串并通过该字符串.

以下是使用JSON.NET将对象序列化为字符串的样本

var s = Newtonsoft.Json.JsonConvert.SerializeObject(createUserVm);
TempData["newuser"] = s;
return RedirectToAction("Index", "Users");

现在在Index操作方法中,从tempdata读取此值,并将其反序列化为您的CreateUserViewModel类对象.

public IActionResult Index()
{
   if (TempData["newuser"] is string s)
   {
       var newUser = JsonConvert.DeserializeObject<CreateUserViewModel>(s);
       // use newUser object now as needed
   }
   // to do : return something
}

2)将简单类型的字典设置为tempdata

var d = new Dictionary<string, string>
{
    ["FullName"] = rvm.FullName,
    ["Email"] = rvm.Email;
};
TempData["MyModelDict"] = d;
return RedirectToAction("Index", "Users");

并稍后阅读它

public IActionResult Index()
{
   if (TempData["MyModelDict"] is Dictionary<string,string> dict)
   {
      var name = dict["Name"];
      var email =  dict["Email"];
   }
   // to do : return something
}

其他推荐答案

另一种方法是在会话中存储它.

var s = JsonConvert.SerializeObject(myView);
HttpContext.Session.SetString("myView", s);

并返回

string s = HttpContext.Session.GetString("myView");
myView = JsonConvert.DeserializeObject<MyView>(s);

以上所述是小编给大家介绍的我如何将一个模型与RedirectToAction结合起来?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34193.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。