首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证消息在MVC中的POST-Redirect-GET中丢失

验证消息在MVC中的POST-Redirect-GET中丢失
EN

Stack Overflow用户
提问于 2009-06-30 10:43:31
回答 2查看 1K关注 0票数 0

我有一个带有操作索引的ProductController (它加载一个空白表单)。表单还会发布到自身,因为它是一个复杂的表单,并且表单元素(如dropdowns )显示发布的值,代码如下

代码语言:javascript
复制
 public ActionResult Index()
    {
        int id;
        id = Convert.ToInt32(Request.Form["ddlLendingType"]);
        if (id == 0)
            id = 1;
        ProductCommonViewModel viewData = new ProductCommonViewModel(_prodRepository.Method1(),_prodRepository.Method2())
        return View(viewData);
    }

当我单击表单中的submit时,它将保存产品,如果失败,它将显示验证错误消息。

代码语言:javascript
复制
 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Save(FormCollection fc)
    { 
        Product product = new Product();
        try
        {
           ...fill out all properties from form collection
            _prodRepository.SaveProduct(product);

            return RedirectToAction("Index", "Product");
        }
        catch (Exception ex)
        {
            TempData["Message"] = "An Error Occured while saving the product!";
            Validation.UpdateModelStateWithRuleViolation(product, ViewData.ModelState);
            // WHEN I call redirect to action Index on this view I can see the TempData variable but I cannot see validation summary and individual validation messages.How do I persist the msgs across requests?
        }

    } 

helper方法定义如下:

代码语言:javascript
复制
public static void UpdateModelStateWithRuleViolation(IRuleEntity entity, ModelStateDictionary dictModel)
    {
        List<RuleViolation> violations = entity.GetRuleViolations();

        foreach (var item in violations)
        {
            dictModel.AddModelError(item.PropertyName, item.ErrorMessage);
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-30 10:57:50

也将modelstate传递给tempdata。

顺便说一句,不是这样:

代码语言:javascript
复制
 public ActionResult Index()
    {
        int id; //and here You could join declaration with assignment
        id = Convert.ToInt32(Request.Form["ddlLendingType"]);

您可以这样做:

代码语言:javascript
复制
 public ActionResult Index(int ddlLendingType)
        {

使用FormCollection是一种不应该使用的坏习惯。对于极端情况-创建自定义模型绑定器(CodeCampServer具有非常好的绑定机制)或操作过滤器(Kigg的源代码)。

票数 2
EN

Stack Overflow用户

发布于 2010-02-05 18:24:07

我在跨多个请求保留TempData时遇到了问题,我执行了以下操作,以便为每个重定向操作刷新TempData:

代码语言:javascript
复制
protected override RedirectToRouteResult RedirectToAction(string actionName, 
    string controllerName, System.Web.Routing.RouteValueDictionary routeValues)
{
    TempData["Notice"] = TempData["Notice"];
    TempData["Error"] = TempData["Error"];
    TempData["Warning"] = TempData["Warning"];
    return base.RedirectToAction(actionName, controllerName, routeValues);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1063008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档