外键

时间:2016-02-24 16:36:00

标签: c# asp.net-mvc fluentvalidation

当我运行该程序时,我在x.Album.Title == "Disintegration"上获得了一个System.NullReferenceException:

RuleFor(x => x.Contents)
            .NotNull()
            .When(x => x.Album.Title == "Disintegration");

如何对此进行编程,以便在Contents时不接受Album.Title == "Disintegration为空?

模型

[Validator(typeof(ReviewValidation))]
public class Review
{
    public int ReviewID { get; set; }

    [Display(Name = "Album")]
    public int AlbumID { get; set; }

    public virtual Album Album { get; set; }

    public string Contents { get; set; }

    [DataType(DataType.EmailAddress)]
    public string ReviewerEmail { get; set; }
}

验证

public class ReviewValidation : AbstractValidator<Review>
{
    public ReviewValidation()
    {
        RuleFor(x => x.Contents)
            .NotNull()
            .When(x => x.Album.Title == "Disintegration");
    }
}

控制器

public class ReviewsController : Controller
{
    private StoreContext db = new StoreContext();
    public ActionResult Create()
    {
        ViewBag.AlbumID = new SelectList(db.Albums, "AlbumID", "Title");
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Review review)
    {
        if (ModelState.IsValid)
        {
            db.Reviews.Add(review);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.AlbumID = new SelectList(db.Albums, "AlbumID", "Title", review.AlbumID);
        return View(review);
    }
}

查看

@model MVCMusicStore.Models.Review


@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()

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

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

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

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

1 个答案:

答案 0 :(得分:0)

您的视图需要将Album.Title传递回POST操作才能验证它。目前(来自您发布的代码),Album属性为null,因为它从未被分配过实际相册,然后在您发布到操作的视图代码中,您没有包含标题。

无论如何,您获得的异常是因为您的代码中的Album prop为null,并且您正在尝试验证其标题。

您还可以做的是更改验证码,仅验证相册何时为空

When(x => x.Album != null, () => 
{
     RuleFor(x => x.Contents).NotNull().When(x => x.Album.Title == "Disintegration");
}); 
相关问题