How keep original value for some field when execute Edit on MVC?
Option 1:
You could use a readonly attribute:
Something like:
@Html.EditorFor(model => model.DriverID, new { htmlAttributes = new {
@Value = @Html.Action("getNextDriverID"), @readonly = "readonly"} })
Don't worry about the @Value
part as this allows me to call an action method to auto generate a value.
In context, yours would look like:
@Html.EditorFor(model => model.UserId, new { htmlAttributes = new {@readonly = "readonly"} })
Please Note
This answer refers to using razor view engine.
Option 2:
Another option would be to use a different viewModel
altogether:
public class edit User{
public int userId {get; set;}
public string Name {get; set;}
public bool Sex {get; set;}
}
And then 'fill' your data using this in your `Edit ActionResult.
from there, you could then set the values in your [HttpPost] Action method using (linq or otherwise), before then saving to your database.
Option 3: Using ViewBags
since you are only looking to edit 2 parts of your model, you might just want to use the ViewBag
:
Controller:
ViewBag.Item1 = xyz;
ViewBag.Item2 = xyz;
View:
@Html.TextBox("Item1")
@Html.TextBox("Item2")
Then in your post method, you could add these as string parameters:
public ActionResult Edit(string Item1, string Item2)
{
...
You could and actually should make a specific viewmodel for your edit page. Like:
public class UserViewModel
{
public string Name {get; set;}
public bool Sex {get; set;}
}
Then instead of returning the complete user to and from the view, use the UserViewModel.
public ActionResult EditAdmin(int userId)
{
User user = persons.Users.Find(userId);
return View(new UserViewModel
{
Id = user.Id,
Name = user.Name,
Sex = user.Sex
});
}
[HttpPost]
public ActionResult EditAdmin(UserViewModel user)
{
var dbUser = persons.Users.Find(user.Id);
dbUser.Name = user.Name;
dbUser.Sex = user.Sex;
persons.Entry(dbUser).State = EntityState.Modified;
persons.SaveChanges();
}
Fetch the existing version from the database, and then change just the 'modifiable' fields:
public ActionResult EditAdmin(User user)
{
var currentPerson = db.Persons.FirstOrDefault(p => p.id = user.id);
if (currentPerson == null)
return HttpNotFound();
currentPerson.Name = user.Name;
currentPerson.Sex = user.Sex;
// Id and Password are not updated.
db.SaveChanges();
}
- You might also want to do some optimistic concurrency checking as well, to ensure that the version being updated, is in fact current. Ideally, if you have a timestamp, use this, otherwise, you are faced with comparing all fields.
Edit
See also @Kris' comment and Ric's point about creating tailored view models and hence NOT polluting your views with ORM / data tier entities. I also still contend you need to carry a timestamp or hash through the ViewModel to prevent the last one wins
overwriting problem.