在 Asp.net MVC 中将值从视图传递到控制器

Posted

技术标签:

【中文标题】在 Asp.net MVC 中将值从视图传递到控制器【英文标题】:Pass Value from View To Controller in Asp.net MVC 【发布时间】:2013-02-21 15:47:37 【问题描述】:

我正在尝试将消息传递给另一个视图(实际上是同一个控制器)我可以做得很好,但是对我来说有问题..

我是网络新手,看起来不太好..

这里是我的 c# 代码

if (createStatus == MembershipCreateStatus.Success)
        
     string registrationMessage = "You have registered successfully";

     return RedirectToAction("KurumsalGiris", new  message = registrationMessage ); 



[AllowAnonymous] //sonradan eklendi
public ActionResult KurumsalGiris(string message="")


    if (User.Identity.IsAuthenticated)
        return Content("Zaten giriş yapmışsınız");

    ViewBag.RegistrationMessage = message;

    return View();

这里是html

@model E_Cv.Models.LogOnModel

@
    ViewBag.Title = "Kurumsal Giriş";


<h2>Kurumsal Giriş</h2>

<h2>@ViewBag.RegistrationMessage</h2>

<p>
  Please enter your user name and password.
  @Html.ActionLink("Yeni Kurum Kaydı", "KurumsalKayit")
   if you don't have an account.
</p>

所以我不知道如何以不同的方式将值传递给另一个视图。我不想在地址栏上显示这种消息并且用户不得更改它。

其次我可以用“Get”方法吗?

【问题讨论】:

【参考方案1】:

为什么不直接返回不同的视图而不是重定向?事实上,首先发布的代码应该发布到一个控制器,该控制器返回一个成功登录的视图。

事实上,如果用户刚刚登录,您为什么要重定向到要求用户登录的页面?

其他可能的选项包括加密 URL 中的字符串,或者只是在 URL 中传递一个标志,控制器将其转换为相应的字符串。

【讨论】:

感谢@Jonothan 的回答,是的,用户已注册,但我需要通过电话确认。因为网站的这一部分是为公司服务的。然后在我确认之前不能记录它们。这就是我这样做的原因。并且消息将比那个更长。那么即使加密的消息看起来也不好..谢谢。【参考方案2】:

您要做的不是返回 RedirectToAction 您可以直接返回视图:(第二个参数是模型,您可以使用相同的模型类 E_Cv.Models.LogOnModel 向其添加 RegistrationMessage 属性)

return View("<name of the view>",
   new E_Cv.Models.LogOnModel 
     RegistrationMessage = "You have registered successfully"
   );

或者像你之前那样将数据保存在 ViewBag 中:

ViewBag.RegistrationMessage = "You have registered successfully";
return View("<name of the view>");

关于你的最后一个问题,如果你的 URL 中显示了消息,你正在使用 GET 方法,如果你返回一个视图而不是重定向,它将避免在 URL 中显示任何内容

【讨论】:

mmmm 是的,你是对的。我可以使用 View 而不是 RedirectAction。我觉得比别人好?谢谢 Johnathan 的答案的第一部分与此相同,但他随后建议加密 URL 中的字符串,这破坏了他的答案,这就是为什么我给这个答案 +1。 @Ricardo,谢谢,但 ViewBag.RegistrationMessage 看起来是空的.. 在另一个视图或操作中.. ? 对不起,这是我的错 :) 是的,它确实如你所说 :)thanx。据我了解,这是最有用的技术,也感谢@Johnathan【参考方案3】:

您应该在这种情况下使用 TempData

if (createStatus == MembershipCreateStatus.Success)
        
    TempData["Message"] = "You have registered successfully";

    return RedirectToAction("KurumsalGiris"); 

然后在你看来

@if (TempData["Message"] != null) 

    <h2>@TempData["Message"]</h2>

或者,如果您想在控制器中执行此操作,只需保持您的视图与当前相同,并在控制器中设置 ViewBag.RegistrationMessage

ViewBag.RegistrationMessage = TempData["Message"];

【讨论】:

哇,太好了.. 我认为 TempData 类似于 ViewBag 或 ViewData.. 然后我没有尝试,但它按我想要的方式工作.. 你更喜欢使用 Session 还是 TempData ?谢谢 如果我提到了一些我不知道的关于 ASP.NET MVC 的事情(我第一次听说TempData 类),但在阅读了它的作用以及它的作用之后,我会给你 +1有效,我认为使用它是一种讽刺。我只是看不到这种东西的地方...... 我肯定会在 Session 上使用 TempData。将 TempData 视为重定向数据。 我明白了,非常感谢.. 它使用 tempdata 非常有用的信息..thanx【参考方案4】:

如果问题是如何在不使用查询字符串的情况下在控制器之间传递数据,那么一个选项是 Session 对象。

if (createStatus == MembershipCreateStatus.Success)
        
    Session["Message"] = "You have registered successfully";

    return RedirectToAction("KurumsalGiris"); 



[AllowAnonymous] //sonradan eklendi
public ActionResult KurumsalGiris(string message="")

    if (User.Identity.IsAuthenticated)
        return Content("Zaten giriş yapmışsınız");

    ViewBag.RegistrationMessage = (string) Session["Message"];

    return View();

但是,我同意下面的@Jonathan Wood 的观点,这不一定是解决您试图解决的特定问题的最佳方法。尽管如此,作为一种通用技术,它还是值得了解的。

【讨论】:

我从来没有想过使用会话.. 有趣.. 谢谢你让我使用它

以上是关于在 Asp.net MVC 中将值从视图传递到控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.Net MVC 5 中将 javascript 数组从视图传递到控制器

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

如何使用 Asp.net MVC Razor 将隐藏字段值从一个控制器传递到另一个控制器

如何在MVC C#中将文本框和下拉值从视图传递到控制器

在 ASP.NET MVC 中将数据传递到母版页

在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作