我认为我已在下面列出。
当我发布表单时,将调用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绑定方建模???
答案 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());
这可能对你有用......但这一切都取决于你想要做什么。