2016-02-24 3 views
2

Когда я запускаю программу, я получаю System.NullReferenceException на x.Album.Title == "Disintegration" в:FluentValidation RuleFor атрибут внешнего ключа

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

Как можно запрограммировать так, чтобы это Contents не принимается в качестве Null, когда 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; } 
} 

Validation

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") 
} 
+0

Вы нашли решение? –

ответ

0

Ваше мнение должно передать Album.Title обратно на POST-действие, чтобы проверить его. На данный момент (из кода, который вы опубликовали) свойство Album является нулевым, поскольку он никогда не был присвоен фактическому альбому, а затем в коде представления, в котором вы публикуете действие, вы не указали название.

Во всяком случае, исключение, которое вы получаете, - это то, что в вашем коде знак альбома null, и вы пытаетесь проверить его название.

Что вы можете сделать также, чтобы изменить код подтверждения, чтобы проверить только когда альбом не является нулевым

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

 Смежные вопросы

  • Нет связанных вопросов^_^