0

私はMVC3を初めて使用し、最初の小さなプロジェクトに取り組んでいます。Index()とGetData()の2つのアクションを持つHomeControllerがあります。インデックスは、インデックスビューを返すだけです。インデックスページがロードされたら、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

次のように、GetDataActionからViewを返してみてください。

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アクションにインデックスアクションを使用します。

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" />  
    }

GetDataビュー:

    @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インスタンスにデータを入力する代わりに、モデルを返します。

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();

        return View(hosp);                
    }

} 

それを次のレベルに引き上げたい場合は、GetDataを部分ビューに配置し、ajaxを介して取得して、ページがシームレスでリロードされないようにすることができます。

于 2012-10-22T17:40:54.007 に答える