gpt4 book ai didi

c# - MVC 模型绑定(bind)和转换

转载 作者:行者123 更新时间:2023-12-02 22:22:42 25 4
gpt4 key购买 nike

假设我有两个类,一个派生自另一个:

动物和狗

public class Animal
{
public String Name { get; set; }
}

public class Dog : Animal
{
public Boolean HasSpots { get; set; }
}

在我的 Controller 中,我将动物传递给索引 View

public ActionResult Index()
{
return View(new Dog() {Name = "Dog"});
}

索引 - 我将传入的 Animal 转换到带 Dog 的编辑器模板。

@model MvcApplication1.Models.Animal

@using (Html.BeginForm("About", "Home", FormMethod.Post, null))
{
@Html.EditorFor(x => x, "Dog", "Animal")

<input type="submit" value="Begin" />
}

这可以正常工作,但当我将它发布到 About 时尝试在我的 Controller 中显式转换回 Dog 时,它不会转换。我想我必须创建一个自定义模型 Binder ,但我不知道如何做。或者,如果我只是完全遗漏了一些东西。在不包含接口(interface)的情况下解决这个问题的任何方法。

(使用这个作为一个小测试示例,我的实际类有点复杂)

最佳答案

默认模型联编程序不会尝试猜测您是否正在发布比预期更多的派生类。因此,即使您的表单具有更多派生类的字段,如果操作期望类动物,它将创建动物并且您将无法转换为狗,因为从未创建过狗。

我在这里看不到界面可以帮助您的方法。如果您让您的操作接受接口(interface)或抽象类,则默认模型绑定(bind)器将抛出异常,因为它无法实例化所述类型。

自定义模型绑定(bind)器可以为您处理这种情况。我见过的所有方法都涉及将一些额外的元数据混合到一起。

这里是一个使用附加表单字段来保存实际类型的示例。 ViewModel with List<BaseClass> and editor templates

这里是一个使用属性来做某种“已知类型”的例子。 http://mvccontrib.codeplex.com/wikipage?title=DerivedTypeModelBinder&referringTitle=Documentation

关于c# - MVC 模型绑定(bind)和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444134/

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