3

我们将 MVC 4 与实体框架结合使用。我有一个持久的实体基类,这个类定义所有实体都有一个生成的代码GUID Id

public abstract class Entity
{
   public Guid Id {get; set;}
   ;...
}

以及以下具体类:

public class Person : Entity
{
   public List<Position> Positions{get;set;}
   ;...
}

public class Position : Entity
{
   ;...
   public Guid Person{get; set;}
   public Guid PersonId{get; set;} //recently added because of other EF issues :-(
} 

在 Position 视图中,我们尝试了几件事,但 MVC 非常坚持尝试用“PersonId”替换“Id”:

@Html.HiddenFor(x => x.Id)  
@Html.HiddenFor(x => x.PersonId)    

如果我们只有一个 Id 隐藏字段,它会在呈现视图时用 PersonId 覆盖又把事情搞砸了:

public ActionResult Edit (Postion model)
{
    // model.Id = Guid.Parse(Request["PositionId"]);
    ...
    bool isFoiledAganin = modelId.Equals(model.PersonId); // true 
} 

只有取消注释model.Id分配才能解决问题。 我的猜测是,当 ModelBinder 在类中找到带有“id”的东西时,它会丢失它的方式,而不考虑继承的字段。 有没有办法让她直起身子?

4

4 回答 4

3

到目前为止给出的答案都没有解释正在发生的事情或解决问题。现在我们实现 hack:在视图中,我们将 Id 放置在我们明确命名为 Id 的隐藏字段中:

@Html.Hidden("PositionId", Model.Id);   

这可以确保视图将正确的 id 放置在 HTML 中,并将在 FormValueCollection 中返回。

控制器方法的第一个动作是检索该值并将其恢复到模型中:

model.Id = Guid.Parse(Request["PositionId"]);

它很糟糕,但它击败了替代品

于 2013-10-16T07:24:02.207 回答
1

我可能不明白这个问题,但你为什么不使用强类型变体HiddenFor

@Html.HiddenFor(model => model.Id);
@Html.HiddenFor(model => model.Person.Id);

您可以像这样在控制器中获取值:

public ActionResult Edit (Postion model)
{
    Guid positionId = model.Id;
    Guid personId = model.Person.Id;
}

更新:

您不应在视图中使用域(实体)模型,而是创建 ViewModel:

public class PositionModel
{
    public Guid Id { get; set; }
    public Guid PersonId { get; set; }

    // ...
}

然后在你的控制器中:

public ActionResult Edit (int positionId)
{
    // Get position from db.
    Position position = db.Positions.Find(positionId);

    // Map it to a ViewModel.
    PositionModel positionModel = new PositionModel
                                      {
                                        Id = position.Id,
                                        PersonId position.Person.Id
                                      };

    return View(positionModel);
}

[HttpPost]
public ActionResult Edit (Postion model)
{
    Guid positionId = model.Id;
    Guid personId = model.PersonId;
}

您的视图将如下所示:

@model PositionModel;

@Html.HiddenFor(model => model.Id);
@Html.HiddenFor(model => model.PersonId);
于 2013-10-15T10:26:08.713 回答
0

这是因为您给出了名称 PersonID 而不是 id。于是改名。

@Html.Hidden("PersonId", Model.Person.Id) @Html.Hidden("Id", Model.Person.Id)

于 2013-10-15T10:21:44.160 回答
0

用这个

@Html.HiddenFor(model => model.Id);
@Html.HiddenFor(model => model.Person.Id);

希望这可以帮助。

于 2013-10-15T10:54:29.783 回答