【发布时间】:2015-05-26 23:51:30
【问题描述】:
我在将列表项保存到数据库时遇到问题。当要保存字段时(在 HTTP POST Create 中),某些 Lists 属性不必保存,因此我允许 nullabe 用于此类。但是,我从表单中检索并保存了一个字段。由于类很复杂,我将限制我将在此处发布的代码(我将使用一个字段,因为生成的异常是相同的)。
StringValues 是多个 List 字段继承自的 Class,例如本例中的 TestPlanChecklist。
public class TestPlanChecklist:StringValues
{
}
public class StringValues
{
[Key]
public int id { get; set; }
public int ChangeRequestsID { get; set; }
public string Value { get; set; }
public ChangeRequests ChangeRequests { get; set; }
}
我的模型类的一部分
public class ChangeRequests
{
[Required]
public List<TestPlanChecklist> TestPlanChecklist { get; set; }
[Required]
public List<PostActivityChecklist> PostActivityChecklist { get; set; }
[Required]
public List<CMBApproval> CMBApproval { get; set; }
[Required]
public List<TechnicalFeasibility> TechnicalFeasibility { get; set; }
}
在我的创建视图中,这是为 TestPlanChecklist 字段呈现文本框的代码
<div class="form-group">
@Html.LabelFor(model => model.TestPlanChecklist, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<div>
<label class="numbers"> 1 </label>
<input type="text" class="TestPlanChecklist" name="TestPlan" />
<input type="button" value="+" class="roundButton" onclick="add('TestPlanChecklist', 'TestPlan')" />
<input type="button" value="-" class="roundButton" onclick="removeElement('TestPlan')" />
</div>
<div>
<label class="numbers"> 2 </label>
<input type="text" class="TestPlanChecklist" name="TestPlan" />
</div>
<div>
<label class="numbers"> 3 </label>
<input type="text" class="TestPlanChecklist" name="TestPlan" />
</div>
@Html.ValidationMessageFor(model => model.TestPlanChecklist, "", new { @class = "text-danger" })
</div>
</div>
</div>
和HttpPost创建方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "TestPlanChecklist,PostActivityChecklist,PostActivityChecklist,CMBApproval,TechnicalFeasibility")] ChangeRequests changeRequests,
string[] TestPlan)
{
changeRequests.TestPlanChecklist = new List<TestPlanChecklist>();
foreach (var test in TestPlan)
changeRequests.TestPlanChecklist.Add(new TestPlanChecklist { Value = test });
//SendEmails(TechnicalFeasibility, User.Identity.Name, ChangeUrgency, Priority, DescriptionOfChange, Reason);
//SendEmails(CMBApproval, User.Identity.Name, ChangeUrgency, Priority, DescriptionOfChange, Reason);
if (ModelState.IsValid)
{
db.ChangeRequests.Add(changeRequests);
db.SaveChanges();
return RedirectToAction("List");
}
return View(changeRequests);
}
请注意,我只是使用一个字段来提出这个问题,这就是为什么我删除了用于初始化其他 List 字段的代码。
ModelState.IsValid
返回假。我意识到所有 List 字段都有一个错误,这表明它不可能从 System.String 类型转换到特定类。这很有趣,因为我只分配了从表单中检索到的一个字段值,其余的都是可以为空的,这是有道理的。
我哪里出错了?
提前致谢。
【问题讨论】:
-
非常不清楚您要在这里做什么。您生成的唯一表单控件具有
name属性“TestPlan”,它与您的模型无关。为什么你的POST方法有参数ChangeRequests changeRequests? - 您不会发布与ChangeRequests类型的任何属性相关的任何内容,因此由于[Required]属性,验证将始终失败。您还有一个LabelFor()和ValidationMessageFor()与属性TestPlanChecklist相关联,这是没有意义的(同样,您不会为TestPlanChecklist的任何属性生成任何表单控件!) -
@StephenMuecke 表单控件的名称为 TestPlan,因此在我的后构造函数中,我可以添加一个字符串数组,然后将每个字符串添加到 List 字段中。我只使用
ValidationMessageFor()和LabelFor(),因为名为TestPlan 的表单控件设置了TestPlanChecklist的一个属性。我在 HTTP POST 方法上设置了其他字段,其中一些将在应用程序使用期间稍后设置(更新)。 -
您对如何使用 MVC 的误解。您没有与模型中的任何属性相关的表单控件,因此您的 POST 方法不应具有
ChangeRequests的参数!但是您应该拥有一个List<string> TestPlan的视图模型,如果您正在编辑它,则将其发布回来。 -
@StephenMuecke 我在问题中提到我只会显示给我带来麻烦的字段的代码。因为它们是六个这样的字段,所以我使用了 TestPlanChecklist,因为每个字段都抛出了相同的异常。如果我在我的视图中发布了所有代码以及我的模型,那么问题的可读性将受到很大影响
-
我之前的评论仍然存在“您对如何使用 MVC 的误解” 我已经为您回答了其他问题,这是显而易见的。我强烈建议您访问 MVC 站点并学习一些基本教程。除非您的表单控件使用索引器正确命名,否则您无法保存集合,并且您手动创建输入的尝试将始终无法绑定到集合
标签: c# asp.net-mvc asp.net-mvc-5 model-binding