【问题标题】:Trying to update the model in controller to avoid validation尝试更新控制器中的模型以避免验证
【发布时间】:2012-08-27 17:02:13
【问题描述】:

我的模型中有以下属性:

[Display(Name = "ActivityModel_FlashFile", ResourceType = typeof(App_GlobalResources.Models))]
[Required(ErrorMessageResourceName = "ActivityModel_FlashFile_Required", ErrorMessageResourceType = typeof(App_GlobalResources.Models))]
public string FlashFile { get; set; }   

在我的控制器中我这样做:

 ModelState.Remove("FlashFile");
 model.FlashFile = "1";
 try
 {
    this.UpdateModel(model);
 }
 catch (Exception ex)
 {
    string allErrors=string.Join(",",ModelState.Values.SelectMany(v => v.Errors).Select(e=>e.ErrorMessage));
 ...

(当我们到达这个 sn-p 的开头时,FlashFile 是空的)。
然而,此时allErrors 是“需要Flash 文件”。

(我从here 中得到了这样做的想法)。

如何避免验证 FlashFile 属性?

【问题讨论】:

  • 为什么不直接从 FlashFile 属性中去掉Required?
  • 在某些情况下我需要它(最初我在 IF 语句中为 FlashFile 分配了一个“人工”值,但我为这个问题简化了它)。我还需要它进行客户端验证
  • 如果您在某些情况下需要它,那么您的情况最适合 ViewModel 模式(在此处查看更多信息:dotnet.dzone.com/articles/model-view-viewmodel-design

标签: asp.net-mvc model asp.net-mvc-4


【解决方案1】:

如何避免验证 FlashFile 属性?

通过使用适合此视图要求的视图模型。这是正确的做法。如果不需要FlashFile 属性,则为此操作设计一个没有Required 属性的视图模型。

解决此问题的错误方法是尝试重用您的域模型,然后从模型绑定中排除您不想要的属性:

try
{
    this.UpdateModel(model, null, null, new[] { "FlashFile" });
    model.FlashFile = "1";
}
catch (Exception ex)
{
    string allErrors = string.Join(
        ",", 
        ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)
    );
    ...
}

【讨论】:

  • 令人惊讶的是,这给出了完全相同的错误。我不知道这怎么可能......(至于创建一个新模型 - 验证取决于用户的选择,它(当前)不涉及服务器端发送新视图或任何类似的东西)。跨度>
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多