MVC验证取决于表单元素

时间:2014-10-13 05:18:01

标签: validation controller asp.net-mvc-5 asp.net-mvc-views

我正在编写一个MVC 5互联网应用程序,并在视图中有关于验证的问题。

这是我的观看代码:

<div class="form-group">
    @Html.LabelFor(model => model.asset.linkFromExternalResource, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        <div class="checkbox">
            @Html.EditorFor(model => model.asset.linkFromExternalResource)
            @Html.ValidationMessageFor(model => model.asset.linkFromExternalResource, "", new { @class = "text-danger" })
        </div>
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.asset.webAddress, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.asset.webAddress, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.asset.webAddress, "", new { @class = "text-danger" })
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.fileId, "fileId", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("fileId", null, htmlAttributes: new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.fileId, "", new { @class = "text-danger" })
    </div>
</div>

如何编写代码以验证model.asset.webAddressmodel.fileId,具体取决于是否选中model.asset.linkFromExternalResource

我会尝试更好地解释。如果用户选中了model.asset.linkFromExternalResource复选框,则会验证model.asset.webAddress值,但不会验证model.fileId,如果未选中model.asset.linkFromExternalResource复选框,则{{1不会验证值,但会验证model.asset.webAddress

我该如何应对这种情况?我是在视图中还是在控制器中编写此代码?

修改

我添加了model.fileId,但收到以下错误:

  

[NotImplementedException:未实现方法或操作。]

在这行代码中:

MVC Foolproof Validation

不是使用await db.SaveChangesAsync(); ,而是编写自己的自定义验证属性更容易吗?

EDIT2

我创建了一个testModel和一个控制器,但错误仍然存​​在。

这是我的模特:

MVC Foolproof Validation

这是控制器:

public class TestModel
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string name { get; set; }
    public bool testValue { get; set; }
    [RequiredIfTrue("testValue")]
    public string value1 { get; set; }
    [RequiredIfFalse("testValue")]

    public string value2 { get; set; }
}

这是错误:

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

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Id,name,testValue,value1,value2")] TestModel testModel)
{
    if (ModelState.IsValid)
    {
        db.testModels.Add(testModel);
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View(testModel);
}

0 个答案:

没有答案