1

我正在使用带有 asp.net mvc3 的 ADO.Net 实体框架。我有一个首先是数据库的模型。正如我将解释的那样,数据验证在某些情况下不起作用。

我有一个表格,当我提交该表格时,有些项目正在被验证,而另一些则没有。我只是使用这样的表格,

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


   <fieldset>
        <legend></legend>


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

        <div class="editor-field">
            @Html.LabelFor(model => model.ENTITY2.Name)
            @Html.EditorFor(model => model.ENTITY2.Name)
            @Html.ValidationMessageFor(model => model.ENTITY2.Name)
        </div>
    <p>
        <input type="submit" value="Create" />
    </p>

现在,version_id 有验证工作,而 Name 没有。我从另一个实体那里得到这个名字。关于验证为什么不起作用的任何想法?我可以输入不应被允许的空字段,因为该字段是必需的,但是当我按下提交时,我得到一个错误。

4

1 回答 1

3

我认为您的 Model 类允许空值。

我会避免直接在 Views 中使用 Model 类,并为此创建一个单独的 ViewModel(一个 POCO 类)。ViewModel 应该只有视图需要的相关属性。大多数时候不是域模型的所有属性!您可以在 ViewModel 上使用数据注释(必需属性等...)

public class VersionViewModel
{
  [Required]
  public string VersionID { set;get;}

  [Required]
  public string Name { set;get;}
}

您的视图将被强类型化为此 ViewModel。当发布回操作方法时,您将从 ViewModel 中映射您的域模型的值并保存它。

[HttpPost]
public ActionResult Edit(VersionViewModel model)
{
  if(ModelState.IsValid)
  {
     //validation is ok. Let's save
    var domainModel=new Version();
    domainModel.VERSION_ID=model.VersionID ;
    domainModel.Name=model.Name;

    //Let's save and REdirect 
    yourRepositary.SaveVersion(domainModel);
    return RedirectToAction("Saved",new { id=model.ID});     
  }
  return View(model);
}

您可以考虑使用AutoMapper等库,而不是手动映射。

于 2012-10-05T20:27:12.507 回答