В моем классе сущностей Book у меня есть свойство навигации AuthorId. Он используется как dataValueField в списке выбора.
<!--language:lang-csharp-->
public class Book
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public int Stock { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
public virtual List<Review> Reviews { get; set; }
}
ViewBag.AuthorId = new SelectList (db.Authors, "Id", "Name");
Отображается, как и ожидалось, с помощью помощника DropdownList внутри формы.
<div class="form-group m-b-40">
@Html.DropDownList("AuthorId", null, "", htmlAttributes: new { @class = "form-control p-0 input-value", id = "input6" })
<span class="bar"></span>
<div class="error">
<small class="error_form" id="authors_error_message"></small>
<div class="icon"></div>
</div>
<label for="input6">Authors</label>
</div>
Выход:
<!--language:lang-html-->
<select class="form-control p-0 input-value" id="input6" name="AuthorId">
<option value="1">George R.R. Martin</option>
<option value="2">James Dashner</option>
<option value="3">Culian Barns</option>
</select>
Я получаю этот объект Book в своем частичном представлении и использую помощник DisplayFor, чтобы отобразить его в моей таблице, но я хочу, чтобы он отображался как Имя, а не Значение
<!--language:lang-html-->
@model Project.Entities.Book
<td>
<p class="wrap-1">@Html.DisplayFor(b => b.AuthorId)</p>
</td>
Как это сделать?
Обновление
Как отмечалось в комментариях ниже, оказалось, что я должен включать свойства навигации при получении данных из базы данных, так как это сделать правильно, учитывая структуру этого метода действия? Я мог бы включить свойства просто по этому коду:
var mybook = db.Books.Where(b => b.Id == book.Id).Include(a => a.Author).Include(c => c.Category).FirstOrDefault();
Но это можно сделать только после того, как проверяется валидность ModelState, и книга сохраняется в базе данных. Я бы хотел сделать это перед тем, как перейти к ModelState is valid condition
, чтобы я мог проверить, заполнен ли контекст вложенными объектами, прежде чем он будет сохранен в базе данных. Как это сделать?
<!--language:lang-csharp-->
[HttpPost]
public ActionResult Post_AddBook ([Bind(Include = "Id,Name,Description,Price,Stock,DateAdded,ISBN,IsApproved,AuthorId,CategoryId")] Book book, HttpPostedFileBase photo)
{
book.DateAdded = DateTime.Now;
if (ModelState.IsValid)
{
if (photo != null && photo.ContentLength > 0 && (Path.GetExtension(photo.FileName) == ".jpg"))
{
db.Books.Add(book);
db.SaveChanges();
var path = Path.Combine(Server.MapPath("/Uploads/img/"), book.Id + ".jpg");
photo.SaveAs(path);
return PartialView(book);
}
}
}