В ASP.Net MVC 2 можно получить тот же экземпляр модели (с небольшими изменениями) в методе HttpPost, который был передан в HttpGet - PullRequest
0 голосов
/ 05 мая 2010

У меня сложная сущность. Пользователь:

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

где Такси является родителем Пользователя (Такси имеет много пользователей):

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

BaseEntity состоит из публичного виртуального int Id {get; приватный набор; }

Проблема возникает при попытке редактировать пользователя

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

My 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.Id == 0 -> Пользовательский объект имел 5 до редактирования
User.Login == "мой новый логин"
User.Password == "мой новый пароль"
User.Taxi.Id == 0 -> У объекта User.Taxi было 3 до редактирования
User.Taxi.Name == "старое скрытое имя"
User.Taxi.ClientIp == null -> Пользовательский объект имел 192.168.0.1 до редактирования

Q: Можно ли не пометить все поля объекта (которые должны быть в моем UpdateUser) тегом «скрытый», но при этом они остаются неизменными в моем методе HttpPost? например не User.Taxi.ClientIp = null, но User.Taxi.ClientIp = 192.168.0.1

Я использую nhibernate, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Не без тяжелой работы. Я не уверен, заботится ли nhibernate, что это точно такой же экземпляр или нет; вам может понадобиться только сохранить идентификатор организации, чтобы ваша форма работала.

Если второй случай верен, все, что вам нужно сделать, это создать скрытое поле в вашей форме для хранения идентификатора модели. MVC сделает все остальное. Просто бросьте это в форме вверху:

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

Вы можете указать (через белый или черный список), какие свойства можно / нельзя редактировать в форме, если вы беспокоитесь о хакерстве людей (и вам следует)

0 голосов
/ 06 мая 2010

Ответ, предложенный Уиллом, наилучшим образом соответствует моей проблеме:
Для редактирования вашей сущности
- Предоставьте вашему представлению идентификацию сущности, которую вы хотите редактировать
- Опубликуйте вашу модель с идентификацией в скрытом поле (в моем случае я не могу использовать частный сеттер model.Id из-за настроек отображения nhib)
- В методе httpPost используйте GetById (idFromHiddenField) для получения вашей entityFromDatabase
- используйте UpdateModel (entityFromDatabase) - это объединит старую версию(entityFromDatabase) и новая версия entity
- затем ISession.Update (entityFromDatabase) для сохранения изменений в базе данных

...