ViewBag内容未被可视化

时间:2017-07-03 23:57:38

标签: c# asp.net model-view-controller

我是ASP.NET MVC网络开发的新手。 我正在尝试建立一个基本上可以访问数据库的网站,该网站可以由用户填写。

好的,一切都很好,那部分工作正常。我挣扎的是,每当用户将数据插入数据库时​​,我想要显示一条消息,表明他的插入已成功完成,或类似的事情。我想在表单面板中显示它。

这是我到目前为止的代码:

这是用户点击提交按钮时调用的方法:

[HttpPost]
public ActionResult Create(PersonModels person)
{
    try
    {
        // TODO: Add insert logic here
        //Adding to database and holding the response in the viewbag.
        string strInsertion = ConnectionModels.insertPerson(person);
        ViewBag.InsertionResult = strInsertion;

        return RedirectToAction("Index");
    }
    catch
    {
        return View("Index");
    }
}

这是我的索引动作:

public ActionResult Index()
{
    return View();
}

最后,这就是我在index.cshtml中尝试的内容:

<div>
     <label>
         @ViewBag.InsertionResult
     </label>
</div>

我不会完全发布它,因为它非常广泛。但那是在表单面板的div下面。

我希望你能帮助我。

提前致谢! :)

2 个答案:

答案 0 :(得分:3)

重定向到其他操作时,您无法传递ViewBag值。如果您在同一个控制器中,则可以使用TempData在会话中传递值,否则您可以将消息作为参数传递给RedirectionResult,如下所示:

return RedirectToAction("Index", new {message="Your Message"});

然后像这样回复:

public ActionResult Index(string message)
{
    ViewBag.ViewBag.InsertionResult = message;
    return View();
}

这是传递消息的一般方法,但我建议这样:

使用BaseController,其中所有控制器都从这一个继承:

在这里,您可以制作自定义逻辑,如何处理错误消息,通知消息,信息消息等全局消息。

为此您需要创建如下的模型:

我在这里保持简单:

public class GlobalMessage
{
   public string Message { get;set;}
   public AlertType AlertType {get;set;}
}
public enum AlertType
{
   Success, Info, Error, Danger//etc
}

BaseController中你会有这样的事情:

public abstract class BaseController : Controller
{
    protected GlobalMessage GlobalMessage;
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is ViewResult)
        {
            if (GlobalMessage!= null)
            {
                filterContext.Controller.ViewBag.GlobalMessage = GlobalMessage;
            }
            else
            {
                GlobalErrorViewModel globalErrorModelView = TempData["GlobalMessage"] as GlobalMessage;

                if (globalErrorModelView != null)
                {
                    filterContext.Controller.ViewBag.GlobalErrorViewModel = globalErrorModelView;
                }
            }
        }
        base.OnActionExecuted(filterContext);
    }

}

此时您只需在GlobalMessage中注册新的Tempdata,如下所示:

public PeopleController : BaseController
{
    [HttpPost]
    public ActionResult Create(PersonModels person)
    {
        try
        {
            // TODO: Add insert logic here
            //Adding to database and holding the response in the viewbag.
            string strInsertion = ConnectionModels.insertPerson(person);
            TempData["GlobalMessage"] = new GlobalMessage{ AlertType = AlertType.Info, Message = "You have successfully added a new person" }

            return RedirectToAction("Index");
        }
        catch
        {
            return View("Index");
        }
    }
}

然后,这是如何在视图中显示数据的最后一步:

我个人使用弹出窗口或模态窗口来执行此操作:例如,在bootstrapp中,您可以编写如下内容:

GlobalMessage globalMessage = ViewBag.GlobalMessage as GlobalMessage;
   @if (globalMessage != null)
    {
        <!-- Modal -->
        <div class="modal fade" id="globalMessage" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content panel-@globalMessage .AlertType.ToString().ToLower() remove-border-radius">
                    <div class="modal-header panel-heading">
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                    </div>
                    <div class="modal-body">
                        <p class="h-text-primary">@Html.Raw(globalMessage .Message)</p>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-@globalMessage .AlertType.ToString().ToLower() remove-border-radius" data-dismiss="modal">Close</button>
                    </div>
                </div><!-- /.modal-content -->
            </div><!-- /.modal-dialog -->
        </div><!-- /.modal -->
    }

如果有消息,则触发模态:

@if (globalMessage != null)
{
    <script type="text/javascript">
        $(document).ready(function () {
            $('#globalMessage').modal('show');
        });
    </script>
}

此示例说明如何使系统显示不同的消息。简而言之,无论你想要什么!

答案 1 :(得分:0)

重定向后,

ViewDatanull个对象将返回TempData个值。它们的内容仅在当前请求期间存活。

还有另一个属性RedirectToAction,其内容将承受当前的和后续请求,但后续请求。但是,这意味着您可以在调用[HttpPost] public ActionResult Create(PersonModels person) { try { // TODO: Add insert logic here //Adding to database and holding the response in the viewbag. string strInsertion = ConnectionModels.insertPerson(person); TempData[InsertionResult] = strInsertion; return RedirectToAction("Index"); } catch { return View("Index"); } } [HttpGet] public ActionResult Index() { string strInsertion = TempData[InsertionResult]; return View("Index", new { InsertionResult = strInsertion }); } <label> @Model.InsertionResult </label> 时使用它来传递数据。

Index

这里给出了一个很好的解释:http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications/

另一种方法是让您的HttpPost视图采用可选的视图模型,其中包含在数据库中创建Person的{{1}}的结果。您可以使用该模型填充标签的内容。强类型模型FTW!