我遇到麻烦并请求你的帮助。
我有一个简单的课程
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'属性。
谢谢。
答案 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”