Свойства модели POST для контроллера без использования скрытых входных данных? - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь разрешить пользователю просматривать пиво.Учитывая базовые модели:

public class User 
{
     public int Id { get; set; }
     public string Name { get; set; }
}

public class Beer 
{
     public int Id { get; set; }
     public string Name { get; set; }
}

public class BeerReview
{
     public int Id { get; set; }
     public virtual Beer { get; set; }
     public virtual User { get; set; }
     public string Review { get; set; }
}

У меня также есть модель представления:

public class BeerReviewViewModel
{
     public BeerReview Review { get; set; }
     ...
}

У меня есть следующие действия контроллера:

public ActionResult Review(int id)
{
     var beer = // get beer by Id
     BeerReviewViewModel model = new BeerReviewViewModel 
     {
          BeerReview = new BeerReview
          {
               Beer = beer.First()
          }
     };
     return View("Review", model);
}

[HttpPost]
public ActionResult Review(BeerReviewViewModel submission)
{
     if(ModelState.IsValid)
     {
          // here is the problem
          int id = submission.Review.Beer.Id;
     }
}

На мой взгляд, я предоставляю пользователю простую форму для обзора пива.Вид выглядит следующим образом:

@model MyNamespace.BeerReviewViewModel
<h2>Review Beer:  @Model.Review.Beer.Name</h2>

@{
     using(Html.BeginForm()){
          <div>
               @Html.TextAreaFor(b => b.Model.Review.Review)
          </div>
          <div>
               <input type="submit" value="Post Review" />
          </div>
     }
}

Очевидно, что я ничего не отправляю о самом пиве в контроллер, поэтому объект Beer в BeerReviewViewModel всегда равен нулю.Мне интересно, если у меня уже есть объект Beer в представлении до отправки формы, есть ли способ сообщить форме отправить эти данные вместе с POST.Я попытался использовать Bind [Prefix = "b"] на контроллере, но безуспешно.Я полагаю, что я всегда мог просто добавить int к BeerReviewViewModel и отправить скрытое значение идентификатора пива из представления в контроллер (или отправить скрытое значение для каждого свойства пива).Но опять же, это все еще кажется хакерским для меня.Любой совет будет оценен.

1 Ответ

0 голосов
/ 10 марта 2011

Вашу модель необходимо выровнять.Если вы думаете о том, что содержат эти данные, вы просматриваете серию пар ключ-значение, которые инкапсулируются в строку запроса.Вы не сможете иметь вложенные объекты (если только у вашего ctor по умолчанию нет возможности создавать эти вложенные объекты).

Или вы можете написать свой собственный механизм связывания моделей, но я считаю, что это решает не ту проблему.

...