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



编辑解决方案:

答案可以在这里找到:

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

但请参阅下面的里卡多

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

现在,当我从创建视图返回表单时,我会收到以下错误:

传递到字典中的模型项的类型为"Accounts"。模型。LedgerUser,但此字典需要类型为"Accounts"的模型项。ViewModels。LedgerUserViewModel"。描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误以及错误在代码中的来源的更多信息

异常详细信息:系统。InvalidOperationException:传递到字典中的模型项的类型为"Accounts"。模型。LedgerUser,但此字典需要类型为"Accounts"的模型项。ViewModels。LedgerUserViewModel">

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

  1. ASP。净MVC3
  2. 实体框架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);
} 

我的LedgerUserPOST操作方法:

[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,我发现name被正确地设置为"LedgerUser">

Content-Disposition:表单数据;name="LedgerUser.id">

d1cd8e85-700d-4462-a95-7428 dbf58deb-----------------------------7dc963b2304b4内容处置:表单数据;name="LedgerUser.AccountNumber">

1-----------------------------7dc963b2304b4内容处置:表单数据;name="LedgerUser.FirstName">

Gareth-----------------------------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

我不知所措。谢谢各位

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

return View("Index")

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

祝你好运。

如果您将错误类型的视图模型传递到视图页面,您收到的错误听起来就像是收到的错误。你的发布方法是这样的吗?

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

如果是这样的话,您的问题是使用错误的模型类型重新创建视图。也就是说,是的,您应该将LedgerViewModel作为post参数。使用MVC,通常,无论你用get传递到视图中的模型是什么,都将是你在Post上的参数。

你的帖子的建议结构。使用后重定向-获取(PRG)模式。

[HttpPost]
public ActionResult Create(LedgerViewModel model)
{
///---code to do stuff..
return RedirectToAction("Create", new {id = model.LedgerUser.id.ToString()});
}

相关内容

  • 没有找到相关文章

最新更新