MVC3部分模型验证

时间:2012-05-16 11:45:16

标签: c# asp.net-mvc asp.net-mvc-3

我遇到麻烦并请求你的帮助。

我有一个简单的课程

public class Test
{
    [Key]
    public string a { get; set; }

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

    public string b { get; set; }
}

我创建了一个简单的表单来提交新的实体实例并且它可以工作。 我编辑时遇到麻烦: 编辑表单显示“a”和“b”属性。由于'c'只能在新实体中提交,因此不能在我的更新方法中显示(不要问为什么):

public ActionResult Edit(Test t)
{
    if (ModelState.IsValid)
    {
     //get the m instance
      UpdateModel(m,//other params);
      ValidateModel(m);
    }
    //saving code
}

Obiously ModelState.IsValid总是假的(因为'c'是必需的',但它是null)并且UpdateModel抛出异常(出于同样的原因)。 我怎么能对MVC3说“不要在这个控制器方法中验证这个字段?” 我不会在模型类中编写未经验证的字段!我只需更新'b'属性。 谢谢。

4 个答案:

答案 0 :(得分:2)

最简单的方法是为此局部视图创建其他视图模型。

答案 1 :(得分:1)

为此视图创建另一个viewmodel,并针对该viewmodel而不是实体进行验证。

答案 2 :(得分:0)

 @{
   object htmlAttribute = null;
   if(Model.Id > 0)
   {
       htmlAttribute = new { disabled = "disabled" };
   }
 }

 @Html.TextBoxFor(model => model.C, htmlAttributes)

禁用时,C将无法验证

答案 3 :(得分:0)

当表单处于“编辑”模式时,将该字段设置为具有您在控制器中评估的“默认”值的隐藏属性。如果您不想在表单上显示该属性并且仍然需要它,那么您不应该使用“ModeState.IsValid”并进行自己的验证。

隐藏属性的示例:

<强>控制器

    public ActionResult Index() {
        return View();
    }

    public ActionResult Edit(string id) {
        return View((string.IsNullOrEmpty(id)) ? new Test { a = "new" } : FakeRepository.Data(id));
    }

    [HttpPost]
    public ActionResult Edit(Test model) {
        if (ModelState.IsValid) {
            if (model.a == "new") {
                //Create a new record
            } else {
                //Update Record
            }
            return RedirectToAction("Index");
        }
        return View(model);
    }

    public static class FakeRepository {
        public static Test Data(string a) {
            return new Test {
                a = a,
                b = "B",
                c = "C"
            };
        }
    }

<强>实体

public class Test {
    [Key]
    [Display(Name="A Property")]
    public string a { get; set; }

    [Required]
    [Display(Name = "C Property")]
    public string c { get; set; }

    [Display(Name = "B Property")]
    public string b { get; set; }
}

查看

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Test</legend>

        @Html.HiddenFor(model => model.a)       


        @if (Model.a != "new") { 
            @Html.HiddenFor(model => model.c)
        } else { 
            <div class="editor-label">
                @Html.LabelFor(model => model.c)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.c)
                @Html.ValidationMessageFor(model => model.c)
            </div>
        }    

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

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

立即

... /编辑/某事将隐藏“C”

... / Edit / 将显示“C”