I need to get my model properties in Post action, so need to hidden element for them, but I have a problem with type of Dictionary <string, string>. this is My model:
public class ViewModel{
...
public ViewPart ViewPart { get; set; }
}
public class ViewPart {
...
public Dictionary<string, string> Flags { get; set; }
}
And My Controller:
Dictionary<string, string> flags = new Dictionary<string, string>();
flags.Add("kind", "Edit");
flags.Add("Command", "Save");
ViewModel model = new ViewModel(){ Flags = flags };
return View(model);
In View:
@foreach(var item in Model.ViewPart.Flags) {
<input type="hidden" id="ViewPart_Flags_@(item.Key)" value="@item.Value" name="ViewPart.Flags[@(item.Key)]" />
}
Also I try This one :
@foreach(var item in Model.ViewPart.Flags) {
@Html.HiddenFor(modelItem => item)
}
Update
Post Action:
[HttpPost]
public ActionResult MyPostAction(ViewModel model){
//model.ViewPart.Flags is null
}
But in Post action the Flags is Always null, why? where is my fault? Is there any better way to pass variables from View To Action?
You need two hidden fields one for the
Keyand one for theValueif you want to modelbind to a dictionary:Note, you will be also need a running index to make the model binder happy.
Or if you don’t want to have a running you can solve with an addtional hidden
Indexfield:You can find a lots of info about modelbinding with collections in this two article: