如何在POST后获得ViewBag更改?

时间:2014-10-30 14:34:38

标签: c# asp.net-mvc

我有一个使用ASP.NET MVC和C#的单页Web应用程序,控制器代码如下所示。

它只有两个控制器,一个获取索引操作和一个后接触操作。联系人操作适用于我页面底部的联系表单。

以下是发生的事情。当页面运行时,ViewBag.Contact会显示在我的联系表单的标题上。当我提交表格和POST时,查看包保持不变。我假设这是因为我的联系人控制器没有返回View()但返回Redirect(“#Contact”)

我需要使用Redirect,因此页面似乎不会移动或更改,除非在ViewBag.Contact中作为标题。

如果我使用返回View(),我可以使ViewBag工作。但是它会从页面的最顶部再次加载页面而不是表单所在的底部,以使页面看起来没有重新加载。

我的问题是,有没有办法让ViewBag无需重新加载页面或从用户位于表单上的位置移动?

(我知道我可以用其他脚本来完成这个,比如javascript,但我想尽可能多地使用C#ASP.Net)

谢谢

namespace MySite.MVC.Controllers
{
    public class HomeController : Controller
    {            
        public ActionResult Index()
        {
            ViewBag.Contact = "SEND ME AN EMAIL BY FILLING OUT THE FORM";
            return View();                               
        }                    

        [HttpPost]
        public ActionResult Contact(ContactModels c)
        {                
            if (ModelState.IsValid)
            {    
                using (var client = new SmtpClient("smtp.gmail.com", 587))
                {
                    client.EnableSsl = true;
                    client.UseDefaultCredentials = false;
                    client.Credentials = new NetworkCredential("FakeEmail@gmail.com", "password");

                    string body = string.Format(
                        "First Name: {0}\nLast Name: {1}\nEmail: {2}\nComment: {3}",
                        c.FirstName,
                        c.LastName,
                        c.Email,
                        c.Comment
                    );

                    var message = new MailMessage();
                    message.To.Add("SendingEmail@gmail.com");
                    message.From = new MailAddress(c.Email, c.Name);
                    message.Subject = String.Format("Contact Request From: {0} ", c.Name);
                    message.Body = body;
                    message.IsBodyHtml = false;
                    try
                    {
                        client.Send(message);
                    }
                    catch (Exception)
                    {
                        return View("Error");
                    }    
                }                    
            }

            ViewBag.Contact = "THANKS, I'VE RECEIVED YOUR MESSAGE";
            return Redirect("#Contact");                
        }
    }
}

2 个答案:

答案 0 :(得分:1)

答案是

  • 如果不重新加载页面,则无法更新ViewBag
  • 您无法更新ViewBag并在同一页面上显示。

ViewBags为一个请求设置并生效,因此,如果您在页面中(或在其后面的控制器中)设置ViewBag,则可以在您发出其他HTTP请求时显示它(打开另一个页面或刷新当前页面。)

您可以通过其他方式(Ajax,Javascript,PartialViews)完成您的需求

答案 1 :(得分:0)

您正在寻找的是如何渲染“局部视图”。您将最终使用AJAX和JS,但是如果您只想进行部分页面重新加载,但框架可以为您构建大部分内容。以下是一些很好的例子:

http://cmatskas.com/update-an-mvc-partial-view-with-ajax/

http://forums.asp.net/t/1883187.aspx?How+to+update+Partial+View+with+doing+a+submit