0

非常に単純な 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 は OrganizationID の値を提供していないと思います。

[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 メソッドで設定するなどのクレイジーなことを行うために保存します)

4

2 に答える 2

1

OrganizationID をセッションに保存できます

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

次に、EntityKey を次のように設定します。

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

URL に組織 ID がある場合、投稿機能を次のように変更できます。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddFile(Quote quote,Guid? id)

自動的に取得します (適切なルーティングを使用)。

取得中にリポジトリから組織を取得する必要はなく、ID を保存するだけです。

于 2009-10-09T19:44:08.713 に答える
0

ステートレスであるため、データは失われます。GET の引用オブジェクトは、POST で渡されたものと同じ引用オブジェクトではありません。MVC のネイティブ バインディング (プロパティ名による) により、部分的にのみハイドレートされます。CustomModelBinder をセットアップするか、コントローラで Quote オブジェクトを再クエリする必要があります。

于 2009-10-14T14:58:42.293 に答える