I have a question about ASP.NET MVC3 model binding. If I have a class I’m trying to use as a model, but I don’t want the key put on the page, the model doesn’t bind on a POST. Here is an example:
//Data Model
public class MyModel
{
[Key]
public string MyKey {get;set;} //Perhaps this is an ssn that I don't want on the form.
public string MyValueToGet {get;set;} //This is the value I want the user to enter.
}
//Conroller code.
public ViewResult Index()
{
MyModel model = new MyModel{ MyKey = "SecretInfo", MyValueToGet = "" };
return View(new model);
}
public ActionResult Edit(MyModel model)
{
repository.SaveChanges(model)
}
//View code.
@using(Html.BeginForm("Edit", "Home", FormMethod.Post))
{
Enter a value: @Html.EditorFor(m => m.MyValueToGet)
<input type="submit" value="Salve" />
}
So my problem is that model is null when the Edit method is called upon form submission. I can fix this by putting MyKey somewhere on the page (perhaps as a hidden field), but that is unacceptable if it is some sort of sensitive data. Is there a way to solve this problem? I am new to MVC, so I appreciate any help.
Create another unique but otherwise meaningless identifier like an (auto increment int) and use that to bind.
in other words modify your model to something like:
EDIT
I believe your best choice would be to change the MyModel object, as it’s design is flawed. The primary key in the majority of cases (and I think this is one of them) should be a simple auto incrementing integer, meaningless apart from it’s role as the table’s key.
While Luke’s suggestion to use Session is a viable option and a solution that would work, I would personally do something similar to what I’ll explain here, as it would seem to me to be more of the ‘mvc way’ of doing things.
Data model:
Either change your current model to something like what I suggest above, or, if that is not feasible for whatever reason (breaking dependancies or FK relationships), create a new table that can be used as a join, or proxy, if you will:
Obviously, you’d have to do some work to populate this table, but you would then be able to use it to fetch records from
MyModelwithout accessing theMyKeyproperty directly.It’s not considered good practice to use your data models directly in your views, so you want to create a view model as well
Notice we don’t even need the key containing sensitive data in the view model.
Then type your view to the viewModel, not the data model, and include a hidden field for the ModelId
Now in your controller you have your get method
And the post method
I think that’s about as well as I can lay it out. Hope it makes sense.