我需要在ASP.net MVC 5应用程序中的ActionMethods和Views之间传递对象。
我正在使用它进行多页注册 - 以及多页付款。
这是不好的做法吗?我还没有看到在不同控制器之间传递对象的好方法。
代码:
public ActionResult Join1()
{
//
return View("Join2", MyObject);
}
[HttpPost]
public ActionResult Join2(MyObject MyObj)
{
//manipulate object
//return
}
这似乎是一种有效的方法 - 虽然我没有看到很多人这样做。我没有看到在动作方法之间传递任何对象。
这种方法是否存在缺陷,是在视图之间传递模型的更好方法 - 或者每个ActionMethod是否应该坚持使用TempData而不是对象传递简单数据?
为什么我没有看到任何样本项目做这样的事情?
我已经看到了return RedirectToAction("act");
很多 - 但这就是Get并且在URI中传递对象是有限的 - 我不希望用户能够操纵或查看传递的数据。
THX。
答案 0 :(得分:1)
除非我误解了描述,否则您的代码并没有按照您的想法行事。第一个return View("Join2", MyObject);
语句没有执行第二个ActionMethod,它只是将您的数据传递到发生的视图中,与第二个方法具有相同的名称。因此,在呈现View并将其发送回用户之前,//manipulate object
隐含的代码将不会运行。
假设视图文件Join2.cshtml
存在,并且它包含默认的@using (Html.BeginForm())
,则提交表单的用户将导致执行Join2
操作并使用操作呈现相同的视图数据 - 当然,除非您添加另一个return View()
语句来命名不同的视图。
你没有看到这样做的原因是MVC约定是让一个名为与ActionMethod相同的View,这使得代码稍微简单,并且更容易让其他ASP.NET开发人员理解因为这是他们期望看到的。
如果您希望每个视图呈现的表单在回发后执行不同的ActionMethod,那么可以在View代码中执行该操作,其中Html.BeginForm()
具有允许您的several overloads这样做,例如在Join.cshtml
你可以写:
@using (Html.BeginForm("Join2", "JoinController"))
{
// form fields and stuff
}
// Produces the following form element
// <form action="/JoinController/Join2" action="post">
要解决问题的最后部分,&#34;我不希望用户能够操纵或查看正在传递的数据&#34;很遗憾地说,但您提出的代码并没有#39 ; t阻止:用户可以查看 Web表单中的数据,然后再将其发回Join2
方法;他们可以通过将包含他们想要的任何数据的HTTP POST发送回Join2
方法来操纵数据。
如果绝对正确地需要在Join2()
内实际执行Join()
,在将任何内容传递给用户之前,您可以像任何其他C#方法一样调用它:
var myResult = Join2(MyObject);
然后你有一个ActionResult对象,你可以操作或直接返回浏览器。但是,为什么你想要这样做,是超出我的。