0

ASP.NET MVC3でフォームを作成しましたが、データベースに加えた変更を保存するためのエントリを取得できませんが、デバッグ中に、変更がデータコンテキストに反映されていることに気付きました。このコードの実行中にエラーは発生していません。さらに必要な場合はお知らせください。ありがとう!

コントローラ

[HttpPost]
    public ActionResult Edit(Tool tool, FormCollection collection)
    {
        if (collection["Tool.Person.PersonID"] != "")
        {
            tool.Person= context.People.Find(
                 Convert.ToInt32(collection["Tool.Person.PersonID"])
            );
        }
        if (collection["Tool.Company.CompanyID"] != "")
        {
            tool.Company = context.Companies.Find(
                 Convert.ToInt32(collection["Tool.Company.CompanyID"])
            );
        }

        if (ModelState.IsValid)
        {
            context.Entry(tool).State = EntityState.Modified; 
            context.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(tool);
    }

最初の2つのifステートメントは、ユーザーが個人または会社を入力したかどうかを確認し、情報はFormCollectionを介して渡されます。PersonIDとCompanyIDは、それぞれPersonとCompanyの主キーです。メソッドを1行ずつ何度も調べて、同じ結果を達成しました-context.SaveChanges();の後、コンテキストは変更を反映しますが、データベースエントリはPerson_PersonIDとCompany_CompanyIDの両方でnullのままです。

4

1 に答える 1

1

ユーザーがフォームを送信した後、ビューモデルを使用してデータベースにアクセスしてみてください。

これでうまくいくはずです。

ViewModel

using System.ComponentModel.DataAnnotations;

namespace Project.ViewModels
{
    public class _tools
    {
        [Required(ErrorMessage="ToolID is required")]
        public int32 ToolID{ get; set; } //whatever ID you use to retrieve the Tool from the database.

        [Required(ErrorMessage="PersonID is required")]
        public int32 PersonID{ get; set; }

        [Required(ErrorMessage="CompanyID is required")]
        public int32 CompanyID{ get; set; }
    }

}

コントローラーポスト

[HttpPost]
public ActionResult Edit(_tool viewModel)
{

    if (ModelState.IsValid)
    {
        Tool tool = db.GetTool(viewModel.ToolID) //whatever method you use to get a current version of the row.  You already do this before you send the data to the client, so just copy that code

        tool.Person = viewModel.PersonID
        tool.Company = viewModel.CompanyID

        context.Entry(tool).State = EntityState.Modified; 
        context.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(tool);
}

意見

@model = _tool

@using(Html.BeginForm("Edit", "ControllerNameHere", FormMethod.Post, null))
{
    @Html.HiddenFor(model => model.ToolID)
    @*Also add whatever inputs you use to get PersonID and CompanyID from the user.
      Make sure to either use the @Html helpers or to give them names that correspond.
      i.e. name one input PersonID and the other CompanyID*@

    <input type="submit" value="Edit">

}
于 2012-08-02T22:09:38.743 に答える