0

我是 MVC3 的新手,正在尝试处理我的第一个小项目。我有一个 HomeController 有两个动作,Index() 和 GetData()。索引只返回索引视图。当索引页面加载时,我希望有一个 html 按钮或按钮类型的输入。当我单击此按钮时,我希望运行 GetData 操作,该操作根据 linq 查询选择一些数据并返回一个列表。然后在索引视图本身中,在我单击的按钮下方,我希望将列表填充到 html 表中.....我假设使用 foreach 循环。

这不起作用,我想我显然误解了这种 MVC 模式的概念。

我的控制器代码:

    private ReferenceDataContext data = new ReferenceDataContext();

    public ActionResult Index()
    {

        return View();

    }

    public ActionResult GetData()
    {

        using (data)
        {                
            var hosp = (from x in data.Hospitals
                          where x.HAcode == "Q36"
                          select x).ToList();
            ViewData["hosp"] = hosp;
            return RedirectToAction("Index");                
        }

    } 

我的查看代码:

@model IEnumerable<NursingHomes.Models.Hospitals>

@{
    ViewBag.Title = "Hospitals Verify";
}


<br />
<br />
@using (Html.BeginForm("GetData", "Home")) 
{ 
<input type="submit" value="Submit" title="Get Data" />  

<h2>Nursing Homes</h2>

<table>
<tr>
<th>Code</th>
<th>HAcode</th>
<th>Name</th>

</tr>

@foreach (NursingHomes.Models.Hospitals item in (List<NursingHomes.Models.Hospitals>)    ViewData["hosp"])
{ 
<tr>
<td>
@Html.DisplayFor(modelItem=>item.Code)
</td>
<td>
@Html.DisplayFor(modelItem=>item.HAcode)
</td>
<td>
@Html.DisplayFor(modelItem=>item.Name)
</td>

</tr>

}

</table>

} 

我在上面做错了什么?如果不使用 JQuery,这是不可能的吗?

基本问题是,如何在索引页面上单击该按钮,并告诉它运行 GetData 操作,然后使用 GetData 操作返回的列表在按钮下方构建表格。

4

2 回答 2

1

尝试从获取数据操作返回视图,如下所示:

return View("Index",YourModelObject);

您可以在以下视图中使用此模型:

...
<table>
<tr>
<th>Code</th>
<th>HAcode</th>
<th>Name</th>

</tr>
If(Model !=null)
{
@foreach (NursingHomes.Models.Hospitals item in Model)
{ 
<tr>
<td>
 .....

编辑:如果你想保持 URL 相同,那么对 POST 操作使用 index 操作,如下所示:

public ActionResult Index()
        {
            if (Request.HttpMethod.ToLower().Equals("get"))
            {
                return View();
            }
            else
            {
                using (data)
                {
                    var hosp = (from x in data.Hospitals
                                where x.HAcode == "Q36"
                                select x).ToList();

                    return View(hosp);
                }
            }
        }

在您的视图中,您应该删除操作名称和控制器名称参数。

@using (Html.BeginForm("GetData", "Home")) 
{ 
<input type="submit" value="Submit" title="Get Data" /> 
.....

希望这可以帮助。

于 2012-10-22T16:14:12.270 回答
0

您需要将代码分开如下:

  1. 将包含按钮的索引视图
  2. 包含表的数据视图。

索引视图:

    @{
        ViewBag.Title = "Hospitals Verify";
    }

    @using (Html.BeginForm("GetData", "Home")) 
    { 
        <input type="submit" value="Submit" title="Get Data" />  
    }

获取数据视图:

    @model IEnumerable<NursingHomes.Models.Hospitals>
    @{
        ViewBag.Title = "Hospitals Verify";
    }

    @using (Html.BeginForm("GetData", "Home")) 
    { 
        <input type="submit" value="Submit" title="Get Data" />  
    }

    <h2>Nursing Homes</h2>

    <table>
      <tr>
       <th>Code</th>
       <th>HAcode</th>
       <th>Name</th>
      </tr>

     @foreach (var item in Model)
     { 
       <tr>
         <td>
           @Html.DisplayFor(modelItem=>item.Code)
         </td>
         <td>
           @Html.DisplayFor(modelItem=>item.HAcode)
         </td>
         <td>
           @Html.DisplayFor(modelItem=>item.Name)
         </td>
       </tr>
     }

     </table>

然后在您的控制器中,返回模型而不是填充单独的 ViewData 实例

私有 ReferenceDataContext 数据 = new ReferenceDataContext();

public ActionResult Index()
{

    return View();

}

public ActionResult GetData()
{
    using (data)
    {                
        var hosp = (from x in data.Hospitals
                      where x.HAcode == "Q36"
                      select x).ToList();

        return View(hosp);                
    }

} 

如果您想将其提升到一个新的水平,您可以将 GetData 放在局部视图中并通过 ajax 进行检索,这样页面就可以无缝且不会重新加载。

于 2012-10-22T17:40:54.007 回答