【问题标题】:ASP MVC DropDownList error "Converting to Type"ASP MVC DropDownList 错误“转换为类型”
【发布时间】:2012-02-06 08:43:47
【问题描述】:

嘿,我有一个表,其中包含 2 个 int 类型字段,它们是“StatusID”和“TypeID”。 TypeID 工作正常,但 StatusID 返回错误。这是我的控制器的样子:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Project project)
{

    var db = new DB();

    if (ModelState.IsValid)
    {

        try
        {
            db.Projects.InsertOnSubmit(project);
            db.SubmitChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View(project);
        }
    }


    ViewData["Status"] = from c in db.Status
                         select new SelectListItem
                             {
                                 Text = c.Text,
                                 Value = c.StatusID.ToString()
                             };

    ViewData["Types"] = from t in db.Project_Types
                        select new SelectListItem
                            {
                                Text = t.Text,
                                Value = t.TypeID.ToString()
                            };
    return View(project);
}

我得到的错误是:

Message = "从类型 'System.String' 到类型 'ConstructionProject.Models.Status' 的参数转换失败,因为没有 TypeConverter 可以在这些类型之间进行转换。"

但就像我说的,字段“TypeID”和“StatusID”的数据库模型是相同的。

编辑:

数据库架构:

表格项目

ProjectID   int
TypeID      int
StatusID    int
Name        varchar(50)
Description text
DateCreated datetime
ClientID    int
Contractor  int

表格状态

StatusID    int
Text        varchar(50)

表项目类型

TypeID      int
Text        varchar(50)

任何人都知道这里的问题会更正吗?

我的查看页面(更改为 StatusID 后):

        <p>
            <label for="Status">Status:</label>
            <%= Html.DropDownList("StatusID")%>
            <%= Html.ValidationMessage("StatusID", "*")%>
        </p>
        <p>
            <label for="Types">Type:</label>
            <%= Html.DropDownList("Types")%>
            <%= Html.ValidationMessage("Types", "*")%>
        </p>

【问题讨论】:

  • 那么,您到底是从哪里得到这个错误的?我猜,它可能在 View 代码中,您可以假设 ViewData["Status"] 的类型为 Status,而您从控制器传入一个字符串。

标签: c# asp.net-mvc


【解决方案1】:

这是一个黑暗中的镜头:在您看来,您为状态选择列表提供了一个“状态”ID,当您发布一组表单数据时,它会导致默认表单集合映射尝试转换将列表的选定值(这是您的 int StatusID 的字符串版本)放入 ConstructionProject.Models.Status object,但失败。尝试使用“StatusID”作为选择列表的 ID,看看是否有效。

为了获得更好的答案,您还应该发布视图标记的相关部分。

【讨论】:

  • 将其更改为 StatusID 后,我得到:带有键 'StatusID' 的 ViewData 项的类型为 'System.Int32' 但需要为 'IEnumerable' 类型。
  • 好吧,我只是将名称更改为完全不同的名称,并且有效。我想我需要阅读更多关于 ViewData 对象的内容。感谢您的帮助。
  • Alex,我认为您的问题与 ViewData 无关——您的问题是在将用户的表单输入值映射到 Project 对象时发生的。这个过程称为模型绑定,这里有一篇很棒的文章:odetocode.com/Blogs/scott/archive/2009/04/27/…
【解决方案2】:

如果您的视图中有多个表单,请确保使用 BeginForm 方法的正确重载显式设置表单的“操作”属性。那就是:

@using (Html.BeginForm("ACTION_METHOD", "CONTROLLER", FormMethod.Post, null))

而不是这个:

@using (Html.BeginForm())

【讨论】:

    【解决方案3】:

    我认为您的错误可能是由于代码中的某处包含“Status”而不是“StatusId”。请注意,错误表示它正在尝试转换为 Status,而不是 StatusId。

    我在我的一个项目中遇到了这个问题。如果您使用的是实体框架,并且您的对象有一个外键,那么 EF 还将为您创建一个对外部对象的引用(如果我没有准确地描述这一点,请原谅我)。当您键入“MyObject”时。在代码中,Intellisense 将为您提供 Status 和 StatusId。

    在我的例子中,我使用 DropDownListFor() 和 model.PersonType 而不是 model.PersonTypeId。

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多