Проблема со связанной сущностью на asp.net MVC создает форму, используя структуру сущности - PullRequest
0 голосов
/ 09 октября 2009

Я создаю очень простую форму загрузки файла asp.net MVC. В настоящее время у меня проблема с созданием нового объекта базы данных, в котором хранится информация в указанном файле.

Код для метода действия выглядит следующим образом:

[Authorize(Roles = "Admin")]
    public ActionResult AddFile(Guid? id)
    {
        var org = organisationRepository.GetOrganisationByID(id.Value);
        Quote newFile = new Quote();
        newFile.Organisation = org;
        newFile.QuotedBy = User.Identity.Name;
        return View("AddFile", newFile);
    }

Проблема в том, что значение newFile.Organisation теряется при отправке формы обратно. Я полагаю, что EF не предоставляет значение для OrganisationID на этом этапе.

[Authorize(Roles = "Admin")]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddFile(Quote quote)
    {
        //save the file to the FS - nice!
        if (ModelState.IsValid)
        {
            try
            {
                foreach (string inputTagName in Request.Files)
                {
                    HttpPostedFileBase file = Request.Files[inputTagName];
                    if (file.ContentLength > 0)
                    {
                        string filePath = Path.Combine(HttpContext.Server.MapPath("~/Content/TempOrgFiles/")
                        , Path.GetFileName(file.FileName));
                        file.SaveAs(filePath);
                        quote.QuoteURL = file.FileName;
                    }
                }
                surveyRepository.AddQuote(quote);
                surveyRepository.Save();
            }
            catch (Exception ex)
            {
                //add model state errors
                ViewData["error"] = ex.Message;
            }
        }

        return View("AddFile");
    }

Если бы это было linq to sql, я бы упростил настройку OrganisationID, но с EF это невозможно (по крайней мере, с моей настройкой)

Какие-нибудь идеи как лучший способ справиться с этими ситуациями? (за исключением чего-то безумного, например, установки скрытого поля формы для Organisaionid и установки его в методе post)

Ответы [ 2 ]

1 голос
/ 09 октября 2009

Вы можете сохранить OrganisationID в сеансе

[Authorize(Roles = "Admin")]<br> public ActionResult AddFile(Guid? id)<br> {<br> Session["OrganisationID"] = id;<br> }

и затем установите EntityKey что-то вроде:

quote.OrganisationReference.EntityKey = new EntityKey("ContainerName.OrganizationSet","ID",Session["OrganisationID"])

Если у вас есть идентификатор организации в URL, вы можете изменить функцию публикации на:

[AcceptVerbs (HttpVerbs.Post)]
public ActionResult AddFile (Цитата, Guid? id)

и получить его автоматически (с соответствующей маршрутизацией).

Вам не нужно получать организацию из репозитория во время получения, просто храните идентификатор.

0 голосов
/ 14 октября 2009

Данные потеряны, потому что они не сохраняют состояние . Ваш объект цитаты в GET - это не тот объект цитаты, который передан в POST. Это только частично гидратируется из-за нативного связывания в MVC (по именам свойств). Вам нужно либо настроить CustomModelBinder , либо запросить ваш объект Quote в контроллере.

...