2015-11-18 2 views
0

У меня есть следующая ошибка, смотрящая меня в лицо.Элемент модели, переданный в словарь, имеет тип «System.Data.Entity.DynamicProxies.game

Модели элемент передается в словарь типа «System.Data.Entity.DynamicProxies.game_04BC2EA428E3397C72CED2755A5A78B93F676BBC970F6B9A8635AD53B08FEBCB», но этот словарь требует модель элемента типа «» TeamBuildingCompetition.ViewModels.EditGameVM

У меня есть ASP Приложение .NET NVC 5 для интрасети. Я создал представление вида из модели представления для обновления содержимого моей базы данных. Контент данной базы данных представляет собой содержимое html, которое было размещено в текстовом редакторе. Когда я загружаю вид редактирования, он показывает указанную выше ошибку.

Ниже мой взгляд редактирования:

@model TeamBuildingCompetition.ViewModels.EditGameVM 

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_Layout_new.cshtml"; 
} 
<script> 
    tinymce.init({ selector: '#description' }); 
    tinymce.init({ selector: '#gameRule' }); 
</script> 

@using (Html.BeginForm("Update", "Game", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <section id="middle"> 
     <div class="container"> 
      <div class="form-horizontal"> 
       <div class="center"><h1>Edit Games </h1></div> 
       @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
       @Html.HiddenFor(model => model.gameID) 
       <div class="form-group"> 
        @Html.LabelFor(model => model.gameName, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-8"> 
         @Html.EditorFor(model => model.gameName, new { htmlAttributes = new { @class = "form-control" } }) 
         @Html.ValidationMessageFor(model => model.gameName, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

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

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

       <div class="form-group"> 
        @Html.LabelFor(model => model.gamePicture, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-8"> 
         @Html.TextBoxFor(model => model.gamePicture, new { @type = "file", @name = "gamePicture" }) 
        </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> 
    </section> 
} 

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

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

Ниже вид Модель для редактирования Вид:

namespace TeamBuildingCompetition.ViewModels 
{ 
    public class EditGameVM 
    { 
     public int gameID { get; set; } 

     [Required] 
     [Display(Name = "Game Name")] 
     public string gameName { get; set; } 

     [Required][AllowHtml] 
     [Display(Name = "Description")]   
     public string description { get; set; } 

     [Required] 
     [AllowHtml] 
     [Display(Name = "Game Rules")] 
     public string gameRule { get; set; } 

     [Display(Name = "Game Picture")]   
     public string gamePicture { get; set; } 
    } 
} 

И, наконец, вот контроллер сделать обновление:

public ActionResult Update(EditGameVM model) 
    { 
     try { 
     game objGame = new game 
     { 
      gameID = model.gameID, 
      gameName = model.gameName, 
      description = model.description, 
      gameRule = model.gameRule, 
      gamePicture = model.gamePicture.ToString() 
     };    
      objBs.gameBs.Update(objGame); 
      TempData["Msg"] = "Created Successfully!"; 
      return RedirectToAction("Edit"); 
     } 
     catch (DbEntityValidationException dbEx) 
     { 
      var sb = new StringBuilder(); 
      foreach (var validationErrors in dbEx.EntityValidationErrors) 
      { 
       foreach (var validationError in validationErrors.ValidationErrors) 
       { 
        sb.AppendLine(string.Format("Entity:'{0}' Property: '{1}' Error: '{2}'", 
        validationErrors.Entry.Entity.GetType().FullName, 
        validationError.PropertyName, 
        validationError.ErrorMessage)); 
       } 
      } 
      //throw new Exception(string.Format("Failed saving data: '{0}'", sb.ToString()), dbEx); 

      TempData["Msg"] = sb.ToString(); 
      return RedirectToAction("Edit"); 
     } 
    } 

Вот мой метод получения:

public ActionResult Edit(int id = 0) 
    { 
     if (id == 0) 
     { 
      id = 1; 
     } 
     var gameList = objBs.gameBs.GetByID(id); 
     return View(gameList); 
    } 

Я по достоинству оценит все усилия по разрешению этого вопроса.

+0

Сообщение само собой разумеется - вы не передаете правильную модель виду. Но вы не указали свой метод GET, который порождает ошибку. –

+0

У меня есть метод Get в моем вопросе – Guzzyman

+1

'objBs.gameBs.GetByID (id)' не возвращает модель, которая является типом 'EditGameVM', поэтому исключение. Вам нужно инициализировать и экземпляр 'EditGameVM', установить его свойства на основе' gameList', а затем вернуть модель представления. –

ответ

1

Вы не отправляете свою модель для просмотра, поэтому вы поймали ошибку. Это можно сделать по этому пути:

Как использовать некоторые временные mechanisom хранения как TempData

TempData["Msg"] = objGame; 
return RedirectToAction("Edit"); 

Тогда просто прочитать его в ПОЛУЧИТЬAction метод снова вашего View.

public ActionResult Edit() 
{ 
    //Here you should cast your TempData to EditGameVM:  
    EditGameVM receivedModel=TempData["Msg"] as EditGameVM; 

    //To take data from TempData["Msg"], you should use receivedModel object: 
    string gameID=receivedModel.gameID; 
    string gameName=receivedModel.gameName; 
    return View(receivedModel); 
} 

TempData использует Session объект за сценой для хранения данных. Но как только данные будут считаны, данные будут прерваны.

+0

Зачем мне нужно использовать TempData ["Msg"] = sb.ToString(); ? Тогда как я получу идентификатор игры для просмотра, используя этот подход? Я не вижу, где id передается из ActionResult? – Guzzyman

+0

@ Guzzyman, пожалуйста, см. Мой обновленный ответ – StepUp

1

Мне не удалось передать модель на мой взгляд, следовательно, указанная выше ошибка. После тщательного изучения моего кода я сделал следующее в соответствии с советом https://stackoverflow.com/users/3559349/stephen-muecke. Весь кредит принадлежит этому замечательному парню.

public ActionResult Edit(int id = 0) 
    { 
     if (id == 0) 
     { 
      id = 1; 
     } 
     var gameList = objBs.gameBs.GetByID(id); 
     EditGameVM model = new EditGameVM 
     { 
      gameID = id, 
      gameName = gameList.gameName, 
      gamePicture = gameList.gamePicture, 
      gameRule = gameList.gameRule, 
      description = gameList.description 
     }; 
     return View(model); 
    } 
Смежные вопросы