在ASP.net MVC 5中返回与对象不良练习不同的视图?

时间:2017-04-29 12:41:17

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

我需要在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。

1 个答案:

答案 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对象,你可以操作或直接返回浏览器。但是,为什么你想要这样做,是超出我的。