为后端c# MVC中的post对象添加值
本文关键字:对象 添加 post 中的 后端 MVC | 更新日期: 2023-09-27 18:18:11
我有一个这样的问题,是否有可能在MVC中添加一个值到张贴对象
public ActionResult Create([Bind(Include = "ID = 1", LastName, FirstMidName, EnrollmentDate")] Student student)
{
try {
if (ModelState.IsValid)
{
db.Students.Add(student);
db.SaveChanges();
return RedirectToAction("Index");
}
}
}
比如ID = 1,当然这是行不通的。我想添加关于模型的额外信息,在它开始表单验证过程之前。我有像TryValidateModel(my updated model)
这样的选项,但在这种情况下,我要验证我的对象两次,或者其他选项是在前端添加隐藏类型。我想这样做的原因是,我的模型有CRUD操作,而验证在每种类型的CRUD上是不同的。例如,在更新期间,它不会检查值是否存在于数据库中等。
我想出了一个解决方案,使用HTTP方法名称,如HTTPPUT HTTPDELETE,用于验证,它将是REST解决方案。谢谢大家的帮助。
修改ASP.net MVC Actions输入的最佳位置是ModelBinder,创建您的自定义通用ModelBinder并从默认的MVC DefaultModelBinder
继承,并在BindModel
方法覆盖中添加您想要的信息。
这是一个可以扩展的例子,以实现您想要的:
public class CustomModelBinderBinder : DefaultModelBinder
{
private readonly Dictionary<string, object> _extraProperties;
public CustomModelBinderBinder(Dictionary<string, object> extraProperties)
{
_extraProperties = extraProperties;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var model = bindingContext.Model;
var modelType = model.GetType();
var modelProperties = modelType.GetProperties(BindingFlags.Public);
foreach (var property in _extraProperties)
{
var matchingProperty = modelType.GetProperties().FirstOrDefault(p => p.Name == property.Key);
if (matchingProperty != null)
{
try
{
matchingProperty.SetValue(model, property.Value);
}
catch (Exception ex)
{
// what happens when we fail to set this value?
// possibly due to type mismatch, or readonly property
throw;
}
}
}
}
}
在该示例中,要扩展的属性列表出现在构造函数动态参数中,然后对Model
对象使用它来覆盖或扩展其属性。
在网上搜索答案,阅读文章和书籍后,我想出了几个解决我的问题的方法。
1. 添加一个隐藏类型到我的HTML,并通过Post方法发送它。ViewModel验证器使用隐藏类型的值,并根据需要进行验证。但是我不喜欢隐藏类型的想法。
2. 第二个解决方案是使用自定义模型绑定器,它可以是高级解决方案
3.在路由中添加额外的值,这个解决方案是最好的,Action name可以帮助我的模型理解要验证什么。
4. 还有另一种解决方案可以添加Modelstate修改、删除属性,
但我将使用第三个选项,另外我认为使用REST逻辑,并根据HTTP方法验证