Mvc 在隐藏字段中覆盖我的 ID

本文关键字:覆盖 我的 ID 字段 隐藏 Mvc | 更新日期: 2023-09-27 18:35:19

我们将MVC 4与Entity Framework结合使用。我有一个持久的实体基类,这个类定义了所有实体都有一个代码生成的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 :-(
} 

在位置视图中,我们尝试了几件事,但 MVC 非常坚持不懈地尝试将"Id"替换为"PersonId":

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

如果我们只有一个 Id 隐藏字段,则在渲染视图时会用 PersonId 覆盖如果我们将其设为"PositionId",则会保留并在 FormValue 集合中返回(请求["PositionId"]产生正确的值),但MVC ModelBinder再次出错:

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

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

Mvc 在隐藏字段中覆盖我的 ID

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

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

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

控制器方法的第一个操作是检索该值并将其还原到模型:

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

这很糟糕,但它击败了替代方案

我可能不明白这个问题,但你为什么不使用强类型变体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;
}

更新:

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

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

这是因为您指定了名称 PersonID 而不是 id。所以改名。

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

使用这个

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

希望这有帮助。