2

解決策の編集:

答えはここにあります:

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 に戻しますか? 次のテクノロジーを使用しています。

  1. ASP.NET MVC3
  2. 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

私は途方に暮れています。みんなありがとう

4

2 に答える 2

2

LedgerUser のポスト アクション メソッドで、間違ったモデルで同じビューに戻っている場合、コードはおそらく次のようになります。

return View();

新しいレコードを作成した後に同じページに戻る場合は、get メソッドと同じことを行う必要があります。

var ledgerUser = new LedgerUser()
    {
        id = uniqueKey,
        RecordStatus = " ",
        CreatedDate = DateTime.Now,
        DateOfBirth = DateTime.Today
    };

    var viewModel = new LedgerUserViewModel()
    {
        UserTypes = userTypes,
        LedgerUser = ledgerUser
    };

    return View(viewModel);

これを行いたくない場合は、post アクション メソッドの後に次のような別のビューにリダイレクトするだけです (Index アクションがあると仮定します)。

return View("Index")

さらに良いことに、同じビューに投稿する必要がある場合は、フォーム投稿の代わりに AJAX/jQuery 投稿を使用して Create アクションを呼び出してください。

幸運を。

于 2012-04-19T01:07:38.693 に答える
0

表示されるエラーは、間違ったタイプのビューモデルをビューページに渡した場合に表示されるエラーのように聞こえます。post メソッドは次のようになっていますか?

[HttpPost]
public ActionResult Create(bool Thumbnail,LedgerUser ledgeruser, HttpPostedFileBase imageLoad2)
{
  ///---code to do stuff..
   return View(ledgeruser);
}

その場合、間違ったモデル タイプでビューを再作成していることが問題です。そうは言っても、投稿パラメーターとしてLedgerViewModelを使用する必要があります。MVC では、通常、get でビューに渡したモデルはすべて、Post のパラメーターになります。

投稿の推奨構造。Post Redirect Get (PRG) パターンを使用します。

[HttpPost]
public ActionResult Create(LedgerViewModel model)
{
  ///---code to do stuff..
   return RedirectToAction("Create", new {id = model.LedgerUser.id.ToString()});
}
于 2012-04-18T19:58:52.400 に答える