解決策の編集:
答えはここにあります:
http://forums.asp.net/p/1794394/4941748.aspx/1?p=True&t=634704481730535356
しかし、以下のリカルドもご覧ください。
LedgerUserというコントローラー/ビューがあります。LedgerUserのインスタンスと UserType のインスタンスの SelectList を含むLedgerViewModelと呼ばれる ViewModel と、画像に使用する UniqueId と呼ばれるプロパティがあります。
Create View からフォームを POST すると、次のエラーが表示されます。
ディクショナリに渡されたモデル アイテムは「Accounts.Models.LedgerUser」タイプですが、このディクショナリには「Accounts.ViewModels.LedgerUserViewModel」タイプのモデル アイテムが必要です。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.InvalidOperationException: ディクショナリに渡されたモデル アイテムのタイプは 'Accounts.Models.LedgerUser' ですが、このディクショナリにはタイプ 'Accounts.ViewModels.LedgerUserViewModel' のモデル アイテムが必要です。
今、私の理解では、ViewModel ではなく、Modelを Action Method に戻しますか? 次のテクノロジーを使用しています。
- ASP.NET MVC3
- Entity Framework 4データベース ファースト
私のコードは次のとおりです。
LedgerUserViewModel :
/// <summary>
/// ViewModel to represent the LedgerUser & its required fields.
/// </summary>
public class LedgerUserViewModel
{
public SelectList UserTypes { get; set; }
public string UserType { get; set; }
public LedgerUser LedgerUser { get; set; }
public string UniqueKey { get; set; } //--Used for the Images.
public bool Thumbnail { get; set; }
}
LedgerUserモデルを拡張して、データ注釈で装飾しました。
[MetadataType(typeof(LedgerUserMetaData))]
public partial class LedgerUser
{
public class LedgerUserMetaData
{
[Required(ErrorMessage = "Date Of Birth Required")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = " {0:dd/MM/yyyy}")]
[DataType(DataType.Date)]
public object DateOfBirth { get; set; }
}
}
LedgerUserの GET アクション メソッド:
// GET: /LedgerUser/Create
/// <summary>
/// Action Method to create the LedgerUser. Usually this will be once a user has registered
/// and will be directed from the AccountController.
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
public ActionResult Create(string id)
{
var uniqueKey = new Guid(id);
var userTypes = new SelectList(db.UserTypes, "id", "Description");
var ledgerUser = new LedgerUser()
{
id = uniqueKey,
RecordStatus = " ",
CreatedDate = DateTime.Now,
DateOfBirth = DateTime.Today
};
var viewModel = new LedgerUserViewModel()
{
UserTypes = userTypes,
LedgerUser = ledgerUser
};
return View(viewModel);
}
LedgerUserの私の POST アクション メソッド:
[HttpPost]
public ActionResult Create(bool Thumbnail,LedgerUser ledgeruser, HttpPostedFileBase imageLoad2)
{
///---code to do stuff..
}
私の作成ビュー:
@model Accounts.ViewModels.LedgerUserViewModel
@using Accounts.Models
@using (Html.BeginForm("Create", "LedgerUser", new { Thumbnail = true}, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Ledger User</legend>
<div class="editor-field">
@Html.HiddenFor(model => model.LedgerUser.id)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LedgerUser.AccountNumber,"Account Number")
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LedgerUser.AccountNumber)
@Html.ValidationMessageFor(model => model.LedgerUser.AccountNumber)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LedgerUser.FirstName,"First Name")
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LedgerUser.FirstName)
@Html.ValidationMessageFor(model => model.LedgerUser.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LedgerUser.LastName,"Last Name")
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LedgerUser.LastName)
@Html.ValidationMessageFor(model => model.LedgerUser.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LedgerUser.DateOfBirth,"D.O.B.")
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LedgerUser.DateOfBirth)
@Html.ValidationMessageFor(model => model.LedgerUser.DateOfBirth)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LedgerUser.UserType, "User Type")
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.LedgerUser.UserType,Model.UserTypes)
</div>
<div class="editor-label">
@Html.Label("Avatar")
</div>
<div class="editor-field">
@Html.UploadImageFor(model => model.UniqueKey,thumbnail:true)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
Fiddler を使用して POST を調査したところ、名前が正しく「LedgerUser」に設定されていることがわかりました。
Content-Disposition: フォームデータ。name="LedgerUser.id"
d1cd8e85-700d-4462-aa95-7428dbf58deb -----------------------------7dc963b2304b4 内容気質: フォームデータ; name="LedgerUser.AccountNumber"
1 -----------------------------7dc963b2304b4 Content-気質: フォームデータ; name="LedgerUser.FirstName"
ガレス -----------------------------7dc963b2304b4 内容気質: フォームデータ; name="LedgerUser.LastName"
ブラッドリー -----------------------------7dc963b2304b4 内容気質: フォームデータ; name="LedgerUser.DateOfBirth"
2012 年 4 月 12 日 -----------------------------7dc963b2304b4 コンテンツの気質: フォーム データ。name="LedgerUser.UserType"
b8502da9-3baa-4727-9143-49e33edc910c ------------------------------7dc963b2304b4 内容-気質: フォームデータ; name="imageLoad2"; filename="001.jpg" コンテンツ タイプ: image/jpeg
私は途方に暮れています。みんなありがとう