Видно, что некоторые думают, что даже в MVC 3 входные параметры не могут
будь динамичным
Я так думаю. Давайте посмотрим на приведенный пример:
[HttpPost]
[ValidateInput(false)]
public virtual ActionResult Update(dynamic editorModel) {
if (!TryUpdateModel(_model, "CurrentModel")) {
var parentId = _model.Parent != null ? (string)_model.Parent.Id : null;
var viewModel = new EditViewModel
{
RootModel = _session.Query<IPageModel>()
.Where(model => model.Parent == null)
.SingleOrDefault(),
CurrentModel = _model,
ParentModel = parentId != null ? _session.Load<IPageModel>(parentId) : null,
};
return View("edit", viewModel);
}
UpdateModel(_model);
_model.Metadata.Changed = DateTime.Now;
_model.Metadata.Published = _model.Metadata.IsPublished ? DateTime.Now : default(DateTime?);
_model.Metadata.ChangedBy = HttpContext.User.Identity.Name;
_repository.SaveChanges();
_repository.Refresh(_model);
var page = _model as IPageModel;
if (page.Parent != null) {
_model = _repository.SingleOrDefault<IPageModel>(m => m.Id == page.Parent.Id);
}
return RedirectToAction("index", new { model = _model });
}
Можете ли вы указать мне, как / где именно эта editorModel
динамическая переменная используется внутри этого действия контроллера?
И чтобы еще больше упростить это действие контроллера, оно работает, потому что оно никогда не использует динамическую переменную, переданную в качестве аргумента. Я упростил его, чтобы лучше проиллюстрировать, что это действие примерно выполняет в отношении привязки модели (конечно, отбрасывая весь шум инфраструктуры, который нам здесь не интересен, чтобы проиллюстрировать проблему):
[HttpPost]
public ActionResult Update(dynamic blablabla)
{
dynamic model = new MyViewModel();
UpdateModel(model);
// at this stage the model will be correctly bound
return View(model);
}
Внутри этого действия методы TryUpdateModel
и UpdateModel
вызываются для переменной экземпляра _model
, которая передается в конструкторе и имеет тип IPageModel
. ASP.NET MVC не может знать (конечно, без привязки к пользовательской модели) тип аргумента динамического действия. Просто запустите этот код, поместите точку останова в действие Update
и наблюдайте тип переменной editorModel
. Это будет просто System.Object
. Чудес не бывает.
Так что для меня совершенно нормально, что это работает так же в ASP.NET Web API.