でも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で同じように動作することは完全に正常です。
JSON配列を使用して
public string Post(dynamic value)
{
string s = "";
foreach (dynamic item in value)
{
s = s + item.content + " ";
}
return s;
}
:
優秀な説明をいただき、ありがとうございました。抽象クラスのUserクラス、Userクラスを継承するAdministratorクラスを作成したい場合は、APIコントローラを使用してすべてのユーザーを保存したい場合はどうすればいいですか?それはカスタムモデルバインダーですか?もう一つの質問はUpdateModelです、これはapiコントローラには存在しませんので、既存のオブジェクトをどのように更新するのですか? – Marcus
@Marcus、ASP.NET Web APIでは、このタスクを達成するためにカスタム 'MediaTypeFormatter'を書くことができます。シリアライザとしてJSON.NETを使用する[一例](http://code.msdn.microsoft.com/Using-JSONNET-with-ASPNET-b2423706)があります。 JSON.NETを使用すると、抽象クラスを直列化できる[custom JsonConverter'](http://stackoverflow.com/a/8031283/29407)を書くことができます。 –
私の質問は、Userクラスを継承するタイプのUserの保存と更新に関するものです。この例ではhttp://pastebin.com/sRGW62ywを見てください。もちろん、入力パラメータはLastNameというプロパティを持たないのでUserにすることはできません。それで、入力パラメータは存在しないためバインドしません。これは私が知っている唯一のことは、入力パラメータがUserクラスを拡張しており、拡張クラスからすべてのデータを保存するためです。私がここでやろうとしていることを理解してくれることを願っています – Marcus