将列表项保存到数据库有问题。当要保存字段时(在HTTP中创建),一些列表属性不必保存,因此我允许这样做。但是,有一个字段是我从表单中检索并保存的。由于类是复杂的,所以我将限制我在这里发布的代码(我将使用一个字段,因为生成的异常是相同的)。
StringValues是几个列表字段继承的类,例如本例中的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);
}
请注意,我只是使用一个字段来问这个问题,这就是为什么我删除了初始化其他列表字段的代码。
ModelState.IsValid
返回假。我意识到所有的列表字段都有一个错误,这说明不可能从System.String类型到特定的类。这很有趣,因为我只分配了从表单中检索到的一个字段值,其余的字段值都是空的,这是有意义的。
我哪里出问题了?
提前谢谢。
发布于 2015-05-26 06:55:19
ModelState.IsValid
检查验证规则,它来自DataAnnotations
(在您的例子中是ChangeRequests
ViewModel中的[Required]
属性)。
如果要使用此验证并使某些List
属性为空,则应删除该属性。
发布于 2015-05-26 06:54:29
您可以检查验证的错误。
var errores = new List<ModelError>();
foreach (ModelState modelState in ViewData.ModelState.Values)
{
foreach (ModelError error in modelState.Errors)
{
errores.Add(error);
}
}
发布于 2015-05-26 07:51:30
您会得到ModelState错误,因为ChangeRequest
具有[Required]
属性,并通过Mvc验证。我不清楚你为什么要使用那个动作签名,但这是个糟糕的方法。您应该直接依赖ViewModels
而不是Models
。
public ActionResult Create(ChangeRequestViewModel viewModel)
{
if(ModelState.IsValid == false) return View(viewModel);
var changeRequest = new ChangeRequest();
foreach(var testPlan in viewModel.TestPlans) {
changeRequest.TestPlanChecklist.Add(new TestPlanChecklist { Value = testPlan }
}
// ...
}
https://stackoverflow.com/questions/30461832
复制相似问题