Как отобразить имя автора по AuthorId в вспомогательном методе DisplayFor - PullRequest
0 голосов
/ 28 июня 2019

В моем классе сущностей 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);
                }
            }
         }

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Когда вы получаете данные из базы данных, вам нужно Include вложенную сущность, подобную этой:

context.Books.Where(b=> b.Any()).Include(a => a.Author);
0 голосов
/ 28 июня 2019

Прежде всего, вы используете AuthorId, так что именно это будет отображаться. Если вы хотите, чтобы имя автора, вы должны сделать b.Author.Name

Во-вторых, не рекомендуется напрямую связывать сущности с представлениями. Вы должны иметь ViewModel между ними. Заполните ViewModel, используя сущности, и у вас есть только необходимые свойства / данные в вашей ViewModel, а не все данные сущностей. Кроме того, структурируйте вашу ViewModel таким образом, чтобы он соответствовал вашему сценарию использования для отображения в View. Свяжите ViewModel с представлением и не используйте объект для отображения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...