gpt4 book ai didi

c# - ASP.NET MVC 中的模型警告

转载 作者:太空狗 更新时间:2023-10-29 21:16:02 26 4
gpt4 key购买 nike

我目前在 asp.net mvc 中使用 ModelStateDictionary 来保存验证错误,然后传回给用户。尤其是能够使用 ModelState.IsValid 检查整个模型是否有效。但是,我正在处理的当前应用程序需要能够报告警告。这些并不重要,因此表单内容仍然可以保存,但它们应该显示给用户,以便可以有选择地采取行动。

我一直在查看框架,看看是否有任何明显的地方可以扩展它以允许我执行此操作。我在想另一本带有警告的字典和一个模型错误的子类,称为模型警告。我不确定如何让框架在 View 等中使用我的新容器类。不过,我仍然希望所有现有的错误内容都能正常工作。

如果有人尝试过类似的事情或有任何想法,我将不胜感激他们的意见。

更新:

我已经扩展了 ViewDataDictionary 以添加一些警告

public class AetherViewDataDictionary : ViewDataDictionary
{
public AetherViewDataDictionary()
{
ModelStateWarning = new ModelStateDictionary();
}

public AetherViewDataDictionary(object model) : base(model)
{
ModelStateWarning = new ModelStateDictionary();
}

public AetherViewDataDictionary(ViewDataDictionary viewDataDictionary) : base(viewDataDictionary)
{
ModelStateWarning = new ModelStateDictionary();
}

public ModelStateDictionary ModelStateWarning { get; private set; }
}

我现在遇到的问题是,当我访问我的 View 代码时,这只是为了调试,我失去了它是我的新类型的事实,所以当我尝试将它转换回去并访问我的新字典我不开心。

public partial class Index : ViewPage<PageViewData>
{
protected override void SetViewData(ViewDataDictionary viewData)
{
base.SetViewData(viewData);
}
}

它在这里正确设置了它,但是当我检查类型时它不见了。

编辑:事实证明这是一种愚蠢的做事方式,请参阅下面的答案。

最佳答案

所以我之前的路线被证明是一个坏主意,框架中没有足够的访问权限来获取您需要的位。至少在不重新发明轮子几次的情况下是这样。

我决定沿着扩展 ModelState 类的路线前进,向其添加警告集合:

public class AetherModelState : ModelState
{
public AetherModelState() { }

public AetherModelState(ModelState state)
{
this.AttemptedValue = state.AttemptedValue;

foreach (var error in state.Errors)
this.Errors.Add(error);
}

private ModelErrorCollection _warnings = new ModelErrorCollection();

public ModelErrorCollection Warnings { get { return this._warnings; } }
}

为了能够像添加错误一样轻松地添加警告,我为 ModelStateDictionary 创建了一些扩展方法:

public static class ModelStateDictionaryExtensions
{
public static void AddModelWarning(this ModelStateDictionary msd, string key, Exception exception)
{
GetModelStateForKey(key, msd).Warnings.Add(exception);
}

public static void AddModelWarning(this ModelStateDictionary msd, string key, string errorMessage)
{
GetModelStateForKey(key, msd).Warnings.Add(errorMessage);
}

private static AetherModelState GetModelStateForKey(string key, ModelStateDictionary msd)
{
ModelState state;
if (string.IsNullOrEmpty(key))
throw new ArgumentException("key");

if (!msd.TryGetValue(key, out state))
{
msd[key] = state = new AetherModelState();
}

if (!(state is AetherModelState))
{
msd.Remove(key);
msd[key] = state = new AetherModelState(state);
}

return state as AetherModelState;
}

public static bool HasWarnings(this ModelStateDictionary msd)
{
return msd.Values.Any<ModelState>(delegate(ModelState modelState)
{
var aState = modelState as AetherModelState;
if (aState == null) return true;
return (aState.Warnings.Count == 0);
});
}
}

GetModelStateForKey 代码很复杂,但您应该能够看到我的目标。接下来要做的是编写一些扩展方法,使我能够显示警告和错误

关于c# - ASP.NET MVC 中的模型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com