【问题标题】:Pass Value from View To Controller in Asp.net MVC在 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”方法吗?

【问题讨论】:

    标签: asp.net-mvc view viewbag


    【解决方案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 的观点,这不一定是解决您试图解决的特定问题的最佳方法。尽管如此,作为一种通用技术,它还是值得了解的。

    【讨论】:

    • 我从来没有想过使用会话.. 有趣.. 谢谢你让我使用它
    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2011-02-11
    相关资源
    最近更新 更多