首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC3 -传递给字典的模型项是类型错误的

MVC3 -传递给字典的模型项是类型错误的
EN

Stack Overflow用户
提问于 2012-04-18 19:36:33
回答 1查看 4.5K关注 0票数 2

解决方案的编辑:

答案可以在这里找到:

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

但请看下面的里卡多以及。

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

现在,当我从Create发回表单时,我会得到以下错误:

传递到字典中的模型项的类型是'Accounts.Models.LedgerUser',但是该字典需要一个类型为'Accounts.ViewModels.LedgerUserViewModel‘的模型项。描述:在执行当前web请求时发生了未处理的异常。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。

异常详细信息: System.InvalidOperationException:传入字典的模型项类型为'Accounts.Models.LedgerUser',但该字典需要一个类型为‘Accounts.ViewModels.LedUserViewModel’的模型项。

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

  1. ASP.NET MVC3
  2. Entity Framework 4数据库第一

我的代码是:

LedgerUserViewModel

代码语言:javascript
运行
复制
/// <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模型,用数据注释来修饰:

代码语言:javascript
运行
复制
[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操作方法:

代码语言:javascript
运行
复制
    // 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的后动作方法

代码语言:javascript
运行
复制
[HttpPost]
public ActionResult Create(bool Thumbnail,LedgerUser ledgeruser, HttpPostedFileBase imageLoad2)
{
      ///---code to do stuff..
}

我的创作视图

代码语言:javascript
运行
复制
@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询问了这个帖子,我发现name被正确地设置为“LedgerUser”。

内容-配置:表单-数据;name="LedgerUser.id“

D1cd8e85-700D-4462-a95-7428 dbf58deb

1

加雷斯

布拉德利

2012年4月12日

B 8502 da9-3 3baa 4727-9143-49e33edc910c

我不知所措。谢谢各位

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-19 01:07:38

在LedgerUser的post操作方法中,您将返回到具有不正确模型的相同视图,您的代码可能如下所示:

代码语言:javascript
运行
复制
return View();

如果在创建新记录后返回到同一页,则需要确保在get方法中执行相同的操作:

代码语言:javascript
运行
复制
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操作):

代码语言:javascript
运行
复制
return View("Index")

更好的是,如果您确实需要将文章发布到相同的视图中,那么只需使用AJAX/jQuery来调用Create而不是表单post。

祝好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10216691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档