我是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下面。
我希望你能帮助我。
提前致谢! :)
答案 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">×</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)
ViewData
和null
个对象将返回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!