【问题标题】:Error while Passing model object to view将模型对象传递给视图时出错
【发布时间】:2016-05-24 10:40:02
【问题描述】:

关于这个问题,我已经提到了几个问题(Q1,Q2),但我认为我的问题略有不同。

我已经创建了一个登录页面,成功登录后应该会打开主控制器的索引视图。由于我的索引视图需要模型来绑定表数据,因此我需要将模型对象与登录按钮操作中的视图一起传递。我希望你能理解这个场景。

这是我的登录控制器:

public ActionResult Login() //Get Method for Login
    {
        return View("Login");
    }
    [HttpPost]  // Post Method on Login
    public ActionResult Defaults(string username, string password)
    {
        FloorFactor ff = new FloorFactor(); // tried to create model object to pass in view
        try
        {
            Login_Details login_detail = db.Login_Details.Single(x => (x.UserName == username) && (x.Password == password));
            if (login_detail != null)
            {
                return View("../Home/Index",ff ); // need to get view Index  of home controller.
            }
        }
        catch {  }
        return View("Login");
    }

Index.cshtml 的必需部分

  @model IEnumerable<Pricing_Tool_Test.FloorFactor>

@{
    ViewBag.Title = "Index";
}

错误:

我知道模型需要 Iennumerable 类型的模型对象,但在我的 Defaults 方法中它不允许我传递模型的 Iennumerable 对象。

任何帮助我怎样才能做到这一点?

编辑:

两个控制器不同。登录按钮需要加载 Homecontroller 的视图。它会产生异常,如图所示。如果我评论该行而不是生成上述错误。 :

编辑 2:主页/创建编码

 public PartialViewResult Create()
    {
        return PartialView("_CreatePartial");
    }

    // POST: Home/Create
    [HttpPost]
    public ActionResult Create([Bind(Include = "FloorFactorPercentage,FromDate,ToDate")]FloorFactor floorfactor)
    {

            if (ModelState.IsValid)
            {
                db.FloorFactors.Add(floorfactor);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(floorfactor);

    }

【问题讨论】:

  • 在您的视图中只需使用@model Pricing_Tool_Test.FloorFactor,因为您正在传递单个元素,因此不需要 IEnumerable
  • 成功登录后,它会在 Index.cshtml 上加载目录,因此它不是单个元素,因此需要 IEnumerable
  • 您的代码只是传递了一个名为 'ff' 的空对象
  • @CodeCaster 见编辑。我认为没有必要对帖子投反对票,因为您提到的问题在我的搜索结果中没有找到。链接问题的标题有很大不同。当您没有看到任何搜索努力或不清楚时,会使用 Downvote

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

您已经了解View 期待IEnumerable&lt;Pricing_Tool_Test.FloorFactor&gt; 的问题,并且您正在传递FloorFactor 的单个对象。

您可以相应地填充您的模型并将其传递给视图 -

List<FloorFactor> model = new List<FloorFactor>();
model.Add(ff);

并将其传递给您的视图 -

return View("../Home/Index",new List<FloorFactor> { model} );

话虽如此,对我来说将空模型传递给这样的控制器没有什么意义。如果您不需要在视图中收集 FloorFactor,请将其与类型绑定,而不是 IEnumerable

@model Pricing_Tool_Test.FloorFactor

编辑 - 在您的编辑之后,我建议您重新考虑您的设计方法。

在高层次上,如果登录成功,则重定向到控制器的Get 操作,而不是POST。您不需要将 IEnumerable&lt;FloorFactor&gt; 实例传递给视图。现在您的视图应该在Form 中拥有与FloorFactor 属性绑定的控件。当用户填写这些详细信息时,然后在表单提交时使用POST 调用Create 操作,并将更改保存在数据库中。

【讨论】:

  • 打字太快了,我几乎得到了相同的答案。 :)
  • @hutchonoid - 巧合。事实是,我发帖的速度有点慢。 :)
  • 感谢您的有用回答。它帮助了我一点。通过使用您的代码,它仍然会给我错误,但如果我写 List&lt;FloorFactor&gt; model = new List&lt;FloorFactor&gt;(); return View("link",model) 如果我添加这两行,它会为我提供带有空结果的索引视图。当我传递空模型对象时。那么,知道如何使用现有数据传递实际模型吗?
  • @HarshilShah - 这是因为您将空对象传递给列表 - FloorFactor ff = new FloorFactor();。 ff 对象刚刚被初始化,它没有任何值。只需使用适当的值初始化对象的属性(如果有许多类似 ff 的对象,对所有对象执行相同操作)并添加到列表中。理想情况下,您应该从业务层获取填充模型。
【解决方案2】:

不使用 IEnumerable,只需尝试您的类名“FloorFactor”。因为您没有发送列表。 我认为这将解决您的问题。

@model Pricing_Tool_Test.FloorFactor
@{
    ViewBag.Title = "Index";
}

【讨论】:

    【解决方案3】:

    要么你必须返回 IEnumerable 对象。

    或者在视图中,你只需要把它不带IEnumerable。

    @model Pricing_Tool_Test.FloorFactor
    @{
        ViewBag.Title = "Index";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多