1

我有一个我在下面列出的观点。

当我发布表单时,将调用 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 为空并且编辑不起作用。例外:发生参照完整性约束冲突:定义参照约束的属性值在关系中的主体对象和依赖对象之间不一致。

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

4

1 回答 1

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());

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

于 2013-06-14T09:59:29.880 回答