MVC3 - 传递到字典中的模型项是ERROR类型

时间:2012-04-18 19:36:33

标签: asp.net-mvc-3 controller viewmodel

编辑解决方案:

答案可以在这里找到:

http://forums.asp.net/p/1794394/4941748.aspx/1?p=True&t=634704481730535356

但请参阅以下里卡多

我有一个名为 LedgerUser 的控制器/视图。我有一个名为 LedgerViewModel 的ViewModel,其中包含用于UserType实例的LedgerUser和SelectList实例以及一个名为UniqueId的属性,我将其用于Images。

现在,当我从创建视图中回发表单时,出现以下错误:

传递到字典中的模型项的类型为“Accounts.Models.LedgerUser”,但此字典需要“Accounts.ViewModels.LedgerUserViewModel”类型的模型项。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.InvalidOperationException:传递到字典中的模型项的类型为“Accounts.Models.LedgerUser”,但此字典需要“Accounts.ViewModels.LedgerUserViewModel”类型的模型项。

现在我的理解是你将模型传递回Action方法而不是ViewModel?我使用以下技术:

  1. ASP.NET MVC3
  2. 实体框架4 数据库优先
  3. 我的代码是:

    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”。

      

    内容 - 处置:表单数据; NAME = “LedgerUser.id”

         

    d1cd8e85-700d-4462-aa95-7428dbf58deb   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “LedgerUser.AccountNumber”

         

    1   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “LedgerUser.FirstName”

         

    加雷   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “LedgerUser.LastName”

         

    布拉德利   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “LedgerUser.DateOfBirth”

         

    2012年4月12日   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “LedgerUser.UserType”

         

    b8502da9-3baa-4727-9143-49e33edc910c   ----------------------------- 7dc963b2304b4 Content-Disposition:form-data; NAME = “imageLoad2”; filename =“001.jpg”内容类型:   图像/ JPEG

    我不知所措。谢谢你们

2 个答案:

答案 0 :(得分:2)

在LedgerUser的post action方法中,您将使用不正确的模型返回相同的视图,您的代码可能如下所示:

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 post方法后的方法重定向到另一个视图,例如(假设你有一个Index动作):

return View("Index")

更好的是,如果您确实需要发布到同一个视图,那么只需使用AJAX / jQuery帖子来调用您的Create操作而不是表单帖子。

祝你好运。

答案 1 :(得分:0)

如果您将错误类型的viewmodel传递到您的viewpage,您收到的错误听起来就像您收到的错误。你的帖子方法是这样的吗?

[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()});
}