代码之家  ›  专栏  ›  技术社区  ›  Keltex

验证错误后,如何在ASP.NET MVC 2中重新填充视图模型?

  •  1
  • Keltex  · 技术社区  · 15 年前

    我使用的是ASP.NET MVC 2,问题是。我的视图模型看起来像这样。它包括一些由用户编辑的字段和其他用于显示的字段。这是一个简单的版本

    public class MyModel 
    {
        public decimal Price { get; set; } // for view purpose only
    
        [Required(ErrorMessage="Name Required")]
        public string Name { get; set; }
    }
    

    控制器如下所示:

    public ActionResult Start(MyModel rec)
    {
        if (ModelState.IsValid)
        {
            Repository.SaveModel(rec);
            return RedirectToAction("NextPage");
        }
        else
        {
            // validation error
            return View(rec);
        }
    }
    

    问题是,当存在验证错误并且我调用View(rec)时,我不确定用仅显示的值填充视图模型的最佳方法。

    这个 老路 在我传递表单集合时,我会这样做:

    public ActionResult Start(FormCollection collection)
    {
        var rec = Repository.LoadModel();
        UpdateModel(rec);
        if (ModelState.IsValid)
        {
            Repository.SaveModel(rec);
            return RedirectToAction("NextPage");
        }
        else
        {
            // validation error
            return View(rec);
        }
    }
    

    但是这样做,我会得到一个错误 UpdateModel(rec) : 无法更新“MyModel”类型的模型。

    有什么想法吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Keltex    15 年前

    我想出来了。如果你打电话 UpdateModel 还有一个验证错误,它将抛出一个异常。解决这个问题的方法是呼叫 TryUpdateModel 相反。

        2
  •  0
  •   Ken Henderson    15 年前

    您的价格成员设置器(可能)不应该是公共的,您可能需要考虑从模型中存储价格的位置加载价格。

    另一件事是,渲染视图时,不使用文本框(或其他输入类型)渲染价格。

    public class MyModel 
    {
    
    
        public decimal Price 
        { 
            get
            { 
                return //get the value from something
            }
        } // for view purpose only
    
        [Required(ErrorMessage="Name Required")]
        public string Name { get; set; }
    }
    
        3
  •  0
  •   Robert Koritnik    15 年前

    使用强类型视图

    如果您使用的是强类型视图,那么应该是开箱即用的:

    ViewPage<MyModel>
    

    您的字段应显示为:

    <%= Html.TextBoxFor(m => m.Name) %>
    

    无论如何,不应在可编辑字段中显示只读属性。当您重新显示无效视图并在控制器操作中提供传入的模型对象实例时,您的值应该按预期填充到文本框(或仅字符串容器)中。

    我认为您不应该以这种方式对Price属性有任何问题,但只是为了以防万一您尝试使用此控制器操作声明:

    public ActionResult Start([Bind(Exclude = "Price")]MyModel rec)
    {
        // ...
    }