gpt4 book ai didi

asp.net-mvc - 我的自定义 ASP.NET MVC 实体绑定(bind) : is it a good solution?

转载 作者:行者123 更新时间:2023-12-01 04:21:37 25 4
gpt4 key购买 nike

假设我想允许在页面上选择我们的实体(从下拉列表等),比如说 Product。结果我可能会收到这个:

public ActionResult SelectedAction(Guid productId)
{
}

但是,我想使用模型绑定(bind)器的功能,所以我编写模型绑定(bind)器来从存储库中获取我的产品,而不是使用
public ActionResult SelectedAction(Product product)
{
if (ModelState.IsValid) {} else {}
}

如果产品无效,我的模型绑定(bind)器会将模型状态设置为 false。
现在,这种方法存在问题:
  • 使用像 Html.ActionLink(c => c.SelectedAction(id)) 这样的强类型方法并不总是那么容易,因为我们需要传递 Product,而不是 id。
  • 无论如何,使用实体作为 Controller 参数并不好。
  • 如果模型状态无效,我想重定向回来并显示错误,我无法保留所选产品!因为绑定(bind)的产品没有设置,我的 id 也不在那里。我想做 RedirectToAction(c => c.Redisplay(product)) 但当然这是不可能的。

  • 现在,似乎我又回来使用“Guid productId”作为参数了……但是,我想介绍和讨论一种解决方案。
       public class EntityViewModel<T> where T : BaseEntity
    {
    public EntityViewModel(Guid id)
    {
    this.Id = id;
    }

    public static implicit operator EntityViewModel<T>(T entity)
    {
    return new EntityViewModel<T>(entity.Id);
    }

    public override string ToString()
    {
    return Id.ToString();
    }

    public Guid Id { get; set; }
    public T Instance { get; set; }
    }

    现在,如果我使用
    public ActionResult SelectedAction(EntityViewModel<Product> product)
    {
    if (ModelState.IsValid) {} else {}
    }

    所有问题都解决了:
  • 如果我只有 Id,我可以通过仅设置 Id 的 EntityViewModel。
  • 我不使用实体作为参数。此外,我
    可以使用 EntityViewModel 作为另一个 ViewModel 中的属性。
  • 我可以将 EntityViewModel 传回 RedirectToController 并且它将保留其 Id 值,即
    与验证消息一起重新显示给用户(感谢 MVCContrib 和 ModelStateToTempData/PassParametersDuringRedirect)。

  • 模型绑定(bind)器将从存储库中获取实例,并将设置模型状态错误,例如“在数据库中未找到”等。我可以使用 ActionLink(c => c.Action(Model.MyProductViewModelProperty)) 之类的东西。

    问题是,这里有什么缺点吗?我看不出有什么不好的,但我还是 MVC 的新手,可能会错过一些重要的事情。也许有更好和认可的方法?也许这就是为什么每个人都使用实体 ID 作为输入参数和属性的原因?

    最佳答案

    总的来说,这对我来说似乎是一个很好的方法......

    作为替代方案,您可以将 POCO 用于您的 View 模型,然后我认为所有 3 个问题都会自动解决。你见过允许实体到 DTO 方法的 Automapper 项目吗?通过将 ViewModel 与 EntityModel 分开,这将为您提供更大的灵 active ,但这实际上取决于您正在构建的应用程序的复杂性。

    MVC 的 ViewDataExtensions 也可能有用,而不是创建自定义容器来保存您在数字 2 中提到的各种 View 模型对象。

    MVCContrib 的 ModelStateToTempData 应该适用于任何可序列化的对象(必须对任何进程外的 session 状态提供程序是可序列化的,例如 SQL、Velocity 等),所以即使不包装实体类也可以使用它,不是吗?

    关于asp.net-mvc - 我的自定义 ASP.NET MVC 实体绑定(bind) : is it a good solution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453641/

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