从Razor视图调用参数构造函数

时间:2013-06-13 10:09:46

标签: asp.net-mvc-4 razor

我认为我已在下面列出。

当我发布表单时,将调用Organization的默认构造函数。 但是,我希望调用另一个构造函数来获取Party对象。

如何在Razor或任何其他使用mvc中执行此操作,请提示。

我的代码:

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

查看:

@using P.M.O


@model IEnumerable<O>
@{
ViewBag.Title = "Details";
}

<table>
    <tr>
    <th>
        @Html.Raw("Caption")
    </th>
    <th></th>
</tr>
<tr>
<td colspan="4">
    @using (Html.BeginForm("Edit", "O", FormMethod.Post))
    {
        <table>
            <tr>
            @foreach (var item in Model)
            {

                <td class="txt">
                    @Html.TextBox("C", item.GetValForProp<string>("C"), new { @class = "txt" }) 
                </td>
                <td class="txt">
                    @Html.TextBox("N", item.GetValForProp<string>("N"), new { @class = "txt" })
                </td>
                <td class="txt">
                    @Html.TextBox("D", item.GetValForProp<string>("D"), new { @class = "txt" })
                </td>
                <td>
                    <button type="submit">Edit</button>
                </td>
            }
            </tr>
        </table>
    }
</td>

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

我的组织是另一个对象党的孩子。 所以它将有一个属性方与党组表的详细信息对应组织(orgobj.Party有党对象)。

当我点击编辑时,在我的控制器中,orgobj.Party为空,编辑无效。 异常:发生参照完整性约束违规:定义参照约束的属性值在关系中的主对象和从属对象之间不一致。

请告知我是否正在做某事或如何为编辑控制器中可用的oganization绑定方建模???

1 个答案:

答案 0 :(得分:1)

这有点棘手但可以在某些情况下完成。根据您的代码,我假设在您启动Organization对象时将有一个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.
    }
}

您还必须在Application_Start()

中的Global.asax.cs注册模型装订器
ModelBinders.Binders.Add(typeof(Organization), new OrganizationModelBinder());

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