0

ビューモデルに問題があります。create メソッドがあり、post である create メソッドがあります。私のビューモデルでは、ProjectModel と ActivityLogModel の 2 つのクラスを送信しています。私が抱えている問題は、以下のエラーです。データを ProjectViewModel として戻す必要がありますが、データは ProjectModel からのものです。データが正しい型として返されるようにこれを修正するにはどうすればよいですか。

ディクショナリに渡されたモデル アイテムのタイプは 'GlobalNaming.Models.ProjectModel' ですが、このディクショナリにはタイプ 'GlobalNaming.Models.ProjectViewModel' のモデル アイテムが必要です。

ビューモデル

    public List<ProjectModel> Project { get; set; }
    public List<ActivityLogModel> Activity { get; set; }

コントローラ

    public ActionResult Create()
    {
        ProjectViewModel projectvm = new ProjectViewModel();
        ProjectModel project = new ProjectModel();

        project.ProjectOwner = UserName;
        project.Description = _description;
        project.Timing = _timing;
        project.Availability = _availability;
        project.Positioning = _positioning;
        project.Competitor = _competitor;

        projectvm.Project = project;

        return View(projectvm);
    }

    [HttpPost]
    public ActionResult Create(ProjectModel pm, HttpPostedFileBase files)
    {
        pm.CreatedDate = dtNow;
        pm.UpdatedDateTime = dtNow;
        pm.ProjectStatus = "Initiation";
        pm.Rejected = false;

        if (ModelState.IsValid)
        {
            db.Projects.Add(pm);

            db.SaveChanges();

            UpdateSupportDocs(pm, files);

            return RedirectToAction("Index");
        }

        return View(pm);
    }
4

4 に答える 4

1

投稿アクションで間違ったタイプを返しています。下記参照:

return View(new ProjectViewModel { Project = pm });
于 2013-03-21T20:07:24.640 に答える
0

エラーメッセージから、アクションメソッドから何らかのタイプを送信していて、フォームが別のタイプを予期していることが非常に明確です。

ViewModelのドメインモデルをプロパティとして使用しているのはなぜですか?これにより、ViewModelがドメインモデルに緊密に結合されます。

このようにビューモデルを更新する必要があります

public class ProjectVM
{
  public string ProjectName { set;get;}
  public string ProjectOwner { set;get;}
  //and other relevant properties ONLY  here
}

これを使用して、ビューとの間でデータを送受信します。

public ActionResult Create()
{
  var vm=new ProjectVM();
  return View(vm);
}

次に、ビューがビューモデルに強く入力されていることを確認します。ドメインモデルではありません。

@model ProjectVM
@using(Html.Beginform())
{
  @Html.TextBoxFor(x=>x.ProjectName)
  <input type="submit" />
}

HttpPostアクションメソッドにはProjectVMタイプのパラメーターが含まれるため、MVCモデルバインディングは投稿されたフォーム変数をそれにバインドします。

[HttpPost]
public ActionResult Create(ProjectVM viewModel)
{
  if(ModelState.IsValid)
  {
    //Create domain model object and set the property values and save
     Project proj=new Project();
     proj.Name=viewModel.ProjectName
     proj.ProjectOwner=viewModel.ProjectOwner;

     db.Projects.Add(proj);
     db.SaveChanges();
     return RedirectToAction("Created");
   }
   return View(viewModel);  //returning your view model object
}
于 2013-03-21T20:10:48.123 に答える
0

最初のメソッドでは a を返し、2 番目のメソッドではreturnaProjectViewModelを返しますProjectModel。したがって、それらをマージして同じものを使用しようとするか、別のビューを作成します。

あなたの見解では、あなたは持っています

@Model ProjectModel

つまり、このビューは型のオブジェクトのみを受け入れますProjectModel

ProjectViewModel には ProjectModel のプロパティがあることがわかったので、戻り値を次のように変更することもできます。

return View(new ProjectViewModel { Project = pm })
于 2013-03-21T20:05:51.830 に答える
0

実は問題はProjectModel pmHttpPostCreateメソッドの入力パラメータ parameter です。

ProjectViewModelHttpGetでレンダリングしたCreateため、ProjectModel ではなくポストバックされます。したがって、GET リクエストでレンダリングする型と、Post ハンドラーの入力パラメーターで期待する型を揃えるだけです。

これはうまくいきます:

[HttpPost]
    public ActionResult Create(ProjecViewtModel pvm, HttpPostedFileBase files)
    {
        // TODO:
于 2013-03-21T20:09:29.083 に答える