【问题标题】:Returning a Model to View from Action从操作返回模型到视图
【发布时间】:2019-05-20 07:29:22
【问题描述】:

我是 ASP.NET MVC Web 应用程序的新手。

我在尝试访问时收到以下错误: http://localhost:1160/View/ViewMovies

ViewMovies 是一个将模型返回给视图的动作。同样,我有一个名为 ViewCustomers 的类似操作,它也给了我同样的错误。

错误

ViewController.cs

 public class ViewController : Controller
{
    // GET: View
    public ActionResult Index()
    {
        return View();
    }

    private MovieCustomerViewModel model = new MovieCustomerViewModel();
    public ActionResult ViewMovies()
    {
        model.movies = new List<Movie> {
            new Movie{id=1,name="Shrek"},
            new Movie{id=1,name="Wall-e"}
        };
        return View(model);
    }

    public ActionResult ViewCustomers()
    {
        model.customers = new List<Customer> {
            new Customer{id=1,name="Junaid"},
            new Customer{id=1,name="Zohaib"}
        };
        return View(model);
    }
}

我添加了一个名为 Movie_Customer 的视图文件夹:

它有两个单独的 .cshtml 文件,分别名为 Customers.cshtml 和 Movies.cshtml

Customers.cshtml

@model Ex1.ViewModels.MovieCustomerViewModel


@{
    ViewBag.Title = "Customers";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Customers</h2>


<table class="table table-bordered table-hover" />
<tr>
    <th>ID</th>
    <th>Name</th>
</tr>

@{
    foreach (var v in Model.customers)
    {
        <tr>
            <td>v.id</td>
            <td>v.name</td>
        </tr>
    }
}

Movies.cshtml

@model Ex1.ViewModels.MovieCustomerViewModel

@{
    ViewBag.Title = "Movies";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Movies</h2>


<table class="table table-bordered table-hover" />
<tr>
    <th>ID</th>
    <th>Name</th>
</tr>

@{
    foreach (var v in Model.movies)
    {
        <tr>
            <td>v.id</td>
            <td>v.name</td>
        </tr>
    }
}

我正在做的正是这里所做的:http://techfunda.com/howto/240/return-model-to-view-from-action-method

我做错了什么?
如何消除这些错误? 关于处理视图或视图模型,我应该知道什么?

提前致谢。

【问题讨论】:

  • 所以错误信息是不言自明的。根据约定,您查看文件应位于这些目录之一,并且视图名称应与操作方法名称匹配。但是如果需要,您可以通过显式传递视图路径来覆盖约定。确保您的视图被强类型化为与您从操作方法返回/传递到视图的数据相同的类型。
  • 你的控制器应该命名为MovieCustomerController,你的视图文件夹应该命名为Views/MovieCustomer。然后您可以在返回值中指定视图名称,例如return View("Customers", model).
  • @Shyju 我已经更改了名称并且可以正常工作。谢谢。但我对此感到困惑。如果我的控制器还包含更多操作(显然名称不同),它们使用相同的 .cshtml 视图文件但名称与 .cshtml 文件不同,该怎么办?
  • 你可以显式传递一个视图return View("~/Views/Customer/index.cshtml, listOdCustomers)`

标签: c# asp.net-mvc model-view-controller model server-error


【解决方案1】:

我认为您很困惑,因为当您尝试从控制器返回视图时,您必须获取文字名称并将其放在返回溢出中作为

return View("Customer",model) 

或者在构建控制器时,您可能需要右键单击控制器的名称并为所选控制器选择“创建视图”选项,这会自动将这两者绑定在一起。

视图与控制器的命名约定不同

【讨论】:

    【解决方案2】:

    您的控制器名为ViewController,按照惯例,框架将检查~Views/&lt;ControllerNamePrefix&gt;/ 目录和Views/Shared/ 目录中是否存在与您请求的名称匹配的视图文件(这里您请求的是ViewCustomersViewMovies由于您使用的是return View(model),因此框架将查找名称与操作匹配的视图。如果您想指定视图的名称,请使用return View("ViewName", model))

    要解决您的错误,您可以将视图重命名为 ViewCustomers.cshtmlViewMovies.cshtml,并将这些文件放在新目录中:位置 /Views/View/

    就个人而言,我建议您也重命名您的控制器,因为ViewController 并没有真正说明控制器应该负责什么。在 MVC 应用程序中,大多数控制器都会返回视图。

    总结:

    • 您正在请求名为 ViewCustomers.cshtmlViewMovies.cshtml 的视图,它们在任何文件夹中都不存在。
    • 您的视图不在写入中 Views 文件夹中的子目录,以便框架能够找到 他们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      相关资源
      最近更新 更多