Mat*_*ell 120 c# asp.net-mvc
使用ASP.NET MVC可能需要一些情况(例如表单提交)RedirectToAction.
其中一种情况是,您在表单提交后遇到验证错误并需要重定向回表单,但希望URL反映表单的URL,而不是它提交的操作页面.
由于我要求表单包含最初POST编辑的数据,为了方便用户和验证目的,我如何通过RedirectToAction()?如果我使用viewData参数,我的POST参数将更改为GET参数.
Mat*_*ell 80
解决方案是使用TempData属性来存储所需的Request组件.
例如:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
Run Code Online (Sandbox Code Playgroud)
然后在您的"表单"操作中,您可以:
public ActionResult Form()
{
/* Declare viewData etc. */
if (TempData["form"] != null)
{
/* Cast TempData["form"] to
System.Collections.Specialized.NameValueCollection
and use it */
}
return View("Form", viewData);
}
Run Code Online (Sandbox Code Playgroud)
Haa*_*ked 37
请记住,TempData将表单集合存储在会话中.如果您不喜欢这种行为,可以实现新的ITempDataProvider接口并使用其他一些机制来存储临时数据.除非你知道(通过测量和分析)使用会话状态会伤害你,否则我不会这样做.
Dan*_*Dan 13
看看MVCContrib,你可以这样做:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Run Code Online (Sandbox Code Playgroud)
还有另一种避免tempdata的方法.我喜欢的模式涉及为原始渲染和重新渲染无效表单创建1个操作.它是这样的:
var form = new FooForm();
if (request.UrlReferrer == request.Url)
{
// Fill form with previous request's data
}
if (Request.IsPost())
{
if (!form.IsValid)
{
ViewData["ValidationErrors"] = ...
} else {
// update model
model.something = foo.something;
// handoff to post update action
return RedirectToAction("ModelUpdated", ... etc);
}
}
// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();
Run Code Online (Sandbox Code Playgroud)
这种模式或多或少.有点假.使用此功能,您可以创建1个视图来处理呈现表单,重新显示值(因为表单将填充以前的值),并显示错误消息.
当发布此操作时,如果其有效,则将控制转移到另一个操作.
我正在尝试在.net验证框架中使这个模式变得容易,因为我们构建了对MVC的支持.
| 归档时间: |
|
| 查看次数: |
85955 次 |
| 最近记录: |