3

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 のビューでいくつかのことを試しましたが、MVC はかなりしつこく "Id" を "PersonId" に置き換えようとします。

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

Id 隠しフィールドがある場合は、ビューをレンダリングするときに 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」を持つものを見つけると道を失うということです。 彼女をまっすぐにする方法はありますか?

4

4 に答える 4

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

これは、id の代わりに PersonID という名前を指定したためです。ということで名前変更。

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

于 2013-10-15T10:21:44.160 に答える