gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:32:15 26 4
gpt4 key购买 nike

我们将 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 :-(
}

在 Position 的 View 中,我们尝试了几种方法,但 MVC 相当坚持不懈地尝试将“Id”替换为“PersonId”:

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

如果我们只有一个 Id 隐藏字段,在渲染 View 时它会被 PersonId 覆盖如果我们将它设为“PositionId”,它会被保留并返回到 FormValue 集合中(Request["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”的东西时,它会丢失它的方式,而不考虑继承的字段。 有没有办法让她直截了当?

最佳答案

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

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

这确保 View 将正确的 ID 放置在 HTML 中,并且它将在 FormValueCollection 中返回。

Controller 方法的第一个 Action 是检索该值并将其恢复到模型中:

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

虽然很烂,但胜过其他选择

关于c# - Mvc 在隐藏字段中覆盖我的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com