将RedirectToAction与自定义类型参数一起使用

Rod*_*rez 3 asp.net-mvc-2

asp.net mvc 2

我在Identity控制器中有这个动作

public ActionResult Details(string id, MessageUi message)
{
Run Code Online (Sandbox Code Playgroud)

我正在尝试从另一个控制器重定向到此操作,但我不知道应该如何传递message参数

我正在努力

    var id = "someidvalue"
    var message = new MessageUi("somevalue");
    return RedirectToAction("Details", "Identity", new { id, message});
}
Run Code Online (Sandbox Code Playgroud)

但是message参数为null

Dar*_*rov 8

这很正常.重定向时,您无法在URL中传递复杂对象,这MessageUi就是未收到对象的原因.只有标量属性将被转换为&url中的分离键/值对.


一种可能性是传递此对象的所有简单属性,以便默认模型绑定器可以在目标位置重建它:

var id = "someidvalue"
var message = new MessageUi("somevalue");
return RedirectToAction("Details", "Identity", new { 
    id = id, 
    MessageProp1 = message.MessageProp1,
    MessageProp2 = message.MessageProp2,
    MessageProp3 = message.MessageProp3,
});
Run Code Online (Sandbox Code Playgroud)

您也可以只传递一个消息ID:

var id = "someidvalue";
return RedirectToAction("Details", "Identity", new { 
    id = id, 
    messageId = "somevalue"
});
Run Code Online (Sandbox Code Playgroud)

并使用此ID在详细信息操作中重建消息对象:

public ActionResult Details(string id, string messageId)
{
    var message = new MessageUi(messageId);
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个工作可以通过该MessageUi类型的自定义模型绑定器大大完成.


另一种可能性是使用TempDataSession:

var id = "someidvalue";
TempData["message"] = new MessageUi("somevalue");
return RedirectToAction("Details", "Identity", new { id });
Run Code Online (Sandbox Code Playgroud)

然后在Details操作中:

var message = TempData["message"] as MessageUi;
Run Code Online (Sandbox Code Playgroud)