0

我有 ASP MVC 4 项目。我有一个问题,当我尝试创建新的调查时,控制器中的代码也无法将发布的表单数据绑定到模型。

具体错误是:

从类型“System.String”到类型“DNASurvey.Models.Tenant”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。{System.InvalidOperationException}

这些是我拥有的模型:

public class Tenant {
    [Key]
    public string TenantID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Survey> Surveys { get; set; }
  }

  public class Survey {
    [Key]
    public string SurveyID { get; set; }

    [Required]
    public virtual Tenant Tenant { get; set; }

    [Required]
    [StringLength(100, MinimumLength=5)]
    public string Title { get; set; }

    [Required]
    public DateTime CreatedAt { get; set; }

    [Required]
    public uint CurrentRoundIndex { get; set; }
  }

我也有带有此相关代码的 SurveyController:

public ActionResult Create() {
  AddPossibleTenants();
  return View();
}

//
// POST: /Survey/Create

[HttpPost]
public ActionResult Create(Survey survey) {
  if (ModelState.IsValid) {
    survey.SurveyID = EncodeNameToSingleString(survey.Title);
    db.Surveys.Add(survey);
    db.SaveChanges();
    return RedirectToAction("Index");
  }

  AddPossibleTenants();
  return View(survey);
}

private void AddPossibleTenants() {
  ViewBag.PossibleTenants = db.Tenants.ToList();
}

这个视图用于创建:

@model DNASurvey.Models.Survey

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Survey</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Tenant)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Tenant, new SelectList(ViewBag.PossibleTenants, "TenantID", "Name"))
            @Html.ValidationMessageFor(model => model.Tenant)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.CreatedAt)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CreatedAt)
            @Html.ValidationMessageFor(model => model.CreatedAt)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
4

2 回答 2

0

您的表单正在为租户生成一个选择元素,它将传回一个简单的名称-值对。这不会绑定到模型的租户属性,因为租户在模型中定义为对象,而不是字符串。您需要定义自己的自定义模型绑定器才能使其正常工作。

于 2012-08-05T13:12:04.257 回答
0

我发现了这一系列关于 EF 和 MVC 的帖子这篇文章解释了如何使用脚手架命令创建控制器以及如何构建模型以便 EF 和 MVC 都能正常工作。

于 2012-08-05T13:39:53.643 回答