0

私は複雑なエンティティユーザーを持っています:

    public class User : BaseEntity
    {        
    public virtual Taxi Taxi { get; set; }  --> That is why i call it "complex"
    public virtual string Login { get; set; }           
    public virtual string Password { get; set; }  
    }

Taxi は User の親です (Taxi has-many Users):

    public class Taxi : BaseEntity
    {
      public virtual string Name { get;  set; }
      public virtual string ClientIp { get;  set; }
    }

BaseEntity は public virtual int Id { get; プライベートセット; }

ユーザーを編集しようとすると問題が発生する

    [Authorize]  
    public ActionResult ChangeAccountInfo()
    {
        var user = UserRepository.GetUser(User.Identity.Name);
        return View(user); 
    }

マイ ChangeAccountInfo.aspx

        <fieldset>
        <legend>Fields</legend>
        <%  %>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Login) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Login) %>
            <%: Html.ValidationMessageFor(model => model.Login) %>      
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Password) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Password) %>
            <%: Html.ValidationMessageFor(model => model.Password) %>
        </div>  

         <div class="editor-field">
            <%: Html.HiddenFor(model => model.Taxi.Name)%>               
        </div>     

        <p>
            <input type="submit" value="Save" />
        </p>
       </fieldset>

投稿の変更:

    [Authorize]
    [HttpPost]
    public ActionResult ChangeAccountInfo(User model)
    {
        if (ModelState.IsValid)
        {
            UserRepository.UpdateUser(model); 

            return RedirectToAction("ChangeAccountInfoSuccess", "Account");
        }

        return View(model);
    }

しかし、(User モデル) パラメータには User.Id == 0 があります --> User エンティティは編集前に 5でした
User.Login == "my new login"
User.Password == "my new password"
User.Taxi.Id = = 0 --> 編集前の User.Taxi エンティティは 3
User.Taxi.Name == "old hidden name"
User.Taxi.ClientIp == null --> 編集前の User エンティティは 192.168.0.1

Q: エンティティのすべてのフィールド (UpdateUser にある必要があります) をタグ「hidden」でマークせずに、HttpPost メソッドでそれらを変更しないことは可能ですか? 例: User.Taxi.ClientIp = null ではなく、User.Taxi.ClientIp = 192.168.0.1

問題があれば、私はnhibernateを使用しています。

4

2 に答える 2

1

重い物を持ち上げないわけではありません。nhibernate がまったく同じインスタンスであるかどうかを気にするかどうかはわかりません。フォームを機能させるには、エンティティの ID を保持するだけでよい場合があります。

2 番目のケースが true の場合、フォームに非表示フィールドを作成してモデルの ID を格納するだけです。残りは MVC が行います。これをフォームの上部にチャックするだけです:

<%= Html.HiddenFor(model => model.Id) %>

誰かがハッキングすることを懸念している場合 (そうすべきである場合)、フォーム内で編集できる/できないプロパティを (ホワイトリストまたはブラックリストを介して) 指定できます。

于 2010-05-05T14:35:44.867 に答える
0

ウィルによって提案された答えは、私の問題に最もよく一致します:
エンティティを編集するに
は - 編集するエンティティ ID をビューに提供します
- 非表示フィールドに ID を使用してモデルを投稿します (私の場合、model.Id private は使用できません) nhib マッピング設定によるセッター)
- httpPost メソッドで GetById(idFromHiddenField) を使用して entityFromDatabase を取得します
- UpdateModel(entityFromDatabase) を使用します - 古いバージョン (entityFromDatabase) と新しいバージョンのエンティティをマージします
- 次に ISession.Update(entityFromDatabase) を永続化しますデータベースへの変更

于 2010-05-05T20:40:32.260 に答える