Asp.net mvc 4 从Razor视图调用参数构造函数

Asp.net mvc 4 从Razor视图调用参数构造函数,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我有一个观点,我已经列在下面 当我发布表单时,将调用组织的默认构造函数。 但是,我希望调用另一个构造函数,它接受Party对象 如何在Razor或任何其他使用mvc的系统中做到这一点,请给出建议 我的代码: public O(Pobj) : this() { P= obj; } 视图: 使用P.M.O @模型IEnumerable @{ ViewBag.Title=“详细信息”; } @Html.Raw(“标题”) @使用(Html.BeginF

我有一个观点,我已经列在下面

当我发布表单时,将调用组织的默认构造函数。 但是,我希望调用另一个构造函数,它接受Party对象

如何在Razor或任何其他使用mvc的系统中做到这一点,请给出建议

我的代码:

public O(Pobj)
        : this()
    {
        P= obj;
    }
视图:

使用P.M.O @模型IEnumerable @{ ViewBag.Title=“详细信息”; } @Html.Raw(“标题”) @使用(Html.BeginForm(“编辑”、“O”、FormMethod.Post)) { @foreach(模型中的var项目) { @TextBox(“C”,item.GetValForProp(“C”),新的{@class=“txt”}) @Html.TextBox(“N”,item.GetValForProp(“N”),新的{@class=“txt”}) @Html.TextBox(“D”,item.GetValForProp(“D”),新的{@class=“txt”}) 编辑 } }

除了上述仍未解决的问题外,我还有另一个问题

我的组织是另一个对象方的子组织。 因此,它将有一个属性party,其中包含对应于组织的party表详细信息(orgobj.party具有party对象)

当我点击编辑时,在我的控制器中,orgobj.Party为空,编辑不起作用。 异常:发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和从属对象之间不一致


请告知我是否正在做一些事情,或者如何在编辑控制器中对组织的绑定方建模???

这有点棘手,但在某些情况下可以完成。根据您的代码,我假设在您启动组织对象时,将有一个Party对象可用

我能想到的解决这个问题的唯一方法是通过自定义ModelBinder。在下面的示例中,我假设您有一个传入的PartyId参数,我们可以使用该参数加载Party对象,然后启动Organization对象。您可以用不同的方式检索Party对象,但这并不重要。我只是展示一种使用ModelBinder的方法

public class OrganizationModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        // Try to get incoming PartyId
        int partyId = 0;
        ValueProviderResult value = bindingContext.ValueProvider.GetValue("PartyId");
        if (value == null)
        {
            throw new Exception("Missing party id");
        }
        int.TryParse(value.AttemptedValue, out partyId);

        // Load Party object from PartyId
        DbContext db = new DbContext();
        Party party = db.Parties.FirstOrDefault(p => p.PartyId == partyId);

        if (party == null)
        {
            throw new Exception("Invalid party");
        }


        return new Organization(party);

        // If you want to create an instance dynamically based upon the modelType 
        // passed in as an parameter then you'll have to use the following return
        // line instead. 
        // return Activator.CreateInstance(modelType, party);
        //
        // If using this second return line you just have to add one 
        // ModelBinders.Binders.Add(...) line for each and every one of the models
        // you want to use.
    }
}
您还必须在
Global.asax.cs

ModelBinders.Binders.Add(typeof(Organization), new OrganizationModelBinder());

这可能对你有用……但这完全取决于你想做什么。

这有点棘手,但在某些情况下可以做到。根据您的代码,我假设在您启动组织对象时,将有一个Party对象可用

我能想到的解决这个问题的唯一方法是通过自定义ModelBinder。在下面的示例中,我假设您有一个传入的PartyId参数,我们可以使用该参数加载Party对象,然后启动Organization对象。您可以用不同的方式检索Party对象,但这并不重要。我只是展示一种使用ModelBinder的方法

public class OrganizationModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        // Try to get incoming PartyId
        int partyId = 0;
        ValueProviderResult value = bindingContext.ValueProvider.GetValue("PartyId");
        if (value == null)
        {
            throw new Exception("Missing party id");
        }
        int.TryParse(value.AttemptedValue, out partyId);

        // Load Party object from PartyId
        DbContext db = new DbContext();
        Party party = db.Parties.FirstOrDefault(p => p.PartyId == partyId);

        if (party == null)
        {
            throw new Exception("Invalid party");
        }


        return new Organization(party);

        // If you want to create an instance dynamically based upon the modelType 
        // passed in as an parameter then you'll have to use the following return
        // line instead. 
        // return Activator.CreateInstance(modelType, party);
        //
        // If using this second return line you just have to add one 
        // ModelBinders.Binders.Add(...) line for each and every one of the models
        // you want to use.
    }
}
您还必须在
Global.asax.cs

ModelBinders.Binders.Add(typeof(Organization), new OrganizationModelBinder());


这可能对你有用……但这一切都取决于你想做什么。

有意思的问题,但我很确定你做不到。为什么不在构建之后设置Party属性呢?您需要为
组织注册一个自定义的
ModelBinder
。然而,我仍然很好奇,你会把什么传递给期望参与方的构造函数呢?我可以把参与方对象传递给存在于组织对象(orgObj.Party)中的构造函数。你能建议如何使用ModelBinder吗?这有点紧急,如果有什么不同的处理方法,有人能帮我或给我一些建议吗?这个问题很有趣,但我很确定你们做不到。为什么不在构建之后设置Party属性呢?您需要为
组织注册一个自定义的
ModelBinder
。然而,我仍然很好奇,你会把什么传递给期望参与方的构造函数?我可以把参与方对象传递给存在于组织对象(orgObj.Party)中的构造函数。如何使用ModelBinder,你能提供建议吗?这有点紧急,有人能帮我吗,或者建议是否有任何不同的处理方式吗?Ohlin,谢谢你的回复。你能告诉我这个活页夹最好放在什么地方吗?比如在哪个项目中(我的d2admin拥有所有视图,我的partyweb拥有控制器,partybiz拥有模型)…这是一个很好的问题。它必须与将模型绑定到数据库的部分相关,在您的情况下,它将是partybiz。我可能错了,但我会先试试。嗯,谢谢。我试过活页夹,效果很好!!!最后一个问题,是否有可能对所有模型使用通用绑定器?我有超过20,30个模型,每个模型都有活页夹不是很好,不是吗?所有这些20-30个模型都需要一个派对对象吗?如果你想让它是通用的,它们必须是相同的。不是所有的时间都在聚会上。有些模型有不同的父对象。如果不是通用的,有没有其他方法处理所有模型?Ohlin,谢谢你的回复。你能告诉我放这个活页夹的最佳位置吗?比如在哪个项目中(我的d2admin拥有所有视图,我的partyweb拥有控制器,partybiz拥有模型)…这是一个很好的问题。它必须与将模型绑定到数据库的部分相关,在您的情况下,它将是partybiz。我可能错了,但我会先试试。嗯,谢谢。我试过活页夹,效果很好!!!最后一个问题,是否有可能对所有模型使用通用绑定器?我有超过20,30个模型,每个模型都有活页夹不是很好,不是吗?所有这些20-30个模型都需要一个派对对象吗?如果你希望它是通用的,它们必须是相同的,而不是Pa