У меня есть сложный объект пользователь:ASP.Net MVC 2 является возможностью получить тот же экземпляр модели (с небольшими изменениями) в HttpPost метод, который был принят в HttpGet
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; }
}
где такси является parent of User (Taxi has-many Users):
public class Taxi : BaseEntity
{
public virtual string Name { get; set; }
public virtual string ClientIp { get; set; }
}
BaseEntity состоит из открытого виртуального int Id {get; частный набор; }
Проблема возникает при попытке изменить User
[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.Id == 0 -> Пользовательский объект имел 5 перед редактированием
User.Login == "мой новый Логин"
User.Password == "мой новый пароль"
User.Taxi.Id == 0 -> User.Taxi объект имел 3 перед тем редактировать
User.Taxi. имя == «старое скрытое название»
User.Taxi.ClientIp == NULL -> объект пользователя было 192.168.0.1 до редактирования
Q: можно не отметить все поля объекта (который должен быть в моем UpdateUser) с тегом «скрытый», но все еще не изменился в моем методе HttpPost? , например. не User.Taxi.ClientIp = null, но User.Taxi.ClientIp = 192.168.0.1
Я использую nhibernate, если это имеет значение.
Модель домена! = Просмотр модели. – Paco
@Paco - И это важно, потому что ??? Ни в коем случае MVC REQUIRE не рассматривает модели (и это не должно). –
@Charles Boyung - шаблон MVC не требует отдельных моделей доменов и просмотров. На языке с утиным типом, подобным Ruby, вы можете легко использовать одну модель. В .Net нет утиной печати. Вы можете использовать одну модель, но будет очень сложно подогнать все данные логики, данных и отображения в объекте одного домена, когда представления и контроллеры станут более сложными, чем стандартный сценарий. Создание специализированных классов может быть меньше в .net. В сценарии MVC есть свои преимущества и недостатки как утиного, так и статического скомпилированного подхода. – Paco