1

現在、MVC 4 の学習に少し問題があり、誰かが助けてくれることを願っていました。私が知る限り、検索に表示されたこの質問と重複するものはありませんが、ある場合はその質問に誘導してください。

私の質問は次のとおりです。私が index.aspx ページに表示した学校のリストで、ユーザーが「詳細」リンクをクリックして、その特定の学校の詳細が表示されるようにすることは可能ですか? ? 以下のコードからの関連情報をすべて含めましたが、多すぎる場合はご容赦ください (何が必要か正確にはわかりませんでした)。

ご覧のとおり、ActionResult Index() はデータベース内のすべての学校のリストを返します。私がやりたいのは、彼らが「詳細」をクリックしたときにポストバックして、その学校に関する特定の情報を含むビューが返されるようにすることです。これは可能ですか?クリックされた学校の ID を渡すだけでよいと考えましたが、DAC レイヤーに戻ると、ID (int) をパラメーターとして受け入れています。タイプ「学校」のオブジェクト。これは理にかなっていますか?

価値のあることとして、私は Javascript を少し知っていますが、jQuery、JSON などは (まだ) 知りません。

だから私は5つの層を持っています:

  1. Index.aspx (ビュー)
  2. SchoolController (コントローラー)
  3. SchoolBus (ビジネス層)
  4. SchoolDAC (データベース アクセス クラス)
  5. SchoolVO (オブジェクトの表示)

私のビューオブジェクト:

    SchoolVO.cs:
            public int Id { get; set; }
            public string Name { get; set; }
            public string Slogan { get; set; }

私のデータベースアクセスクラス:

    SchoolDAC.cs
    public static School GetSchool(School school)
    {
        try
        {
            using (SqlConnection conn = ConnectionHelper.GetConnection("SchoolDB"))
            {
                SqlCommand cmd = new SqlCommand("Schools.GetSchool", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@SchoolId", school.Id);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    if (dr.Read())
                    {
                        school = readRecord(dr);
                        // readRecord() is just another method that fills the 3 properties of the school object with data from the database.
                    }
                }
                return school;
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Failed to get school", ex);
        }
    }

私の「ビジネス」層:

    SchoolBus.cs:
    public static School GetSchool(School school)
    {
        school = SchoolDAC.GetSchool(school);
        return school;
    }

私のコントローラー:

    SchoolController.cs:

    public ActionResult Index()
    {
        List<School> model = SchoolBus.GetAllSchools();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(School school)
    {
        School model = SchoolBus.GetSchool(school);
        return View(model);
    }

私の見解:

    index.aspx:
    <table>
        <tr>
            <th>
                <%: Html.DisplayNameFor(model => model.Id) %>
            </th>
            <th>
                <%: Html.DisplayNameFor(model => model.Name) %>
            </th>
            <th>
                <%: Html.DisplayNameFor(model => model.Slogan) %>
            </th>
            <th></th>
        </tr>

    <% foreach (var item in Model) { %>
                <tr>
            <td>
                <%: Html.DisplayFor(modelItem => item.Id) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.Name) %>
            </td>
            <td>
                <%: Html.DisplayFor(modelItem => item.Slogan) %>
            </td>
            <td>    <!--- possible to pass an object through here? --->
                <%: Html.ActionLink("Sign Up", "Index", new { id=item.Id }) %> |
                <%: Html.ActionLink("Details", "Details", new { id=item.Id }) %> |
                <%: Html.ActionLink("Delete", "Delete", new { id=item.Id }) %>
            </td>
        </tr>
    <% } %>

    </table>
4

2 に答える 2

6

学校オブジェクト全体をコントローラーに渡すべきではありません。私のプロジェクトで行ったのと同様の方法を紹介します。

        [HttpGet]
        public ActionResult Edit(int id)
        {
            DbUser editedDbUser = context.Users.Single(x => x.UserId == id);
            User editeduser = Mapper.Map<DbUser, User>(editedDbUser);
            return View("AccountInfo", editeduser);
        }

そして私の見解では、それがかみそりであることは知っていますが、考え方は同じです:

            <tr>
                <td>@(i + 1)</td>
                <td>@usersModel[i].LastName</td>
                <td>@usersModel[i].FirstName</td>
                <td>@usersModel[i].Email</td>
                <td>@Html.ActionLink("Edit", "Edit", new { id = @usersModel[i].UserId })</td>
            </tr>

あなたの質問に答えるために、これは私のモデルです-ビューに渡す前に入力しているのは単なるリストです。

public class Users
    {
        public List<User> UsersBag { get; set; }
    }

モデルに Id がない場合は、リスト内のオブジェクトを区別できる別のプロパティが必要ですが、何らかの ID を保持することをお勧めします。

于 2013-08-23T00:15:43.997 に答える
3

このようにしてみて、

意見

私のアクションリンク

 @Html.ActionLink("EditUser", "DYmanicControllerPage", "Test", new { Id = m.ID }, new { @class = "hide" })

私のコントローラー

 [HttpGet]
 public ActionResult DYmanicControllerPage(string Id)
        {
            var model = new RegisterModel();
            int _ID = 0;
            int.TryParse(Id, out _ID);
            if (_ID > 0)
            {
                RegisterModel register = GetRegisterUserById(_ID);
                model.ID = _ID;
                model.Name = register.Name;
                model.Address = register.Address;
                model.PhoneNo = register.PhoneNo;

        }
        return View(model);
    }

私の「ビジネス」層:

 public RegisterModel GetRegisterUserById(int Id)
        {
            RegisterModel model = new RegisterModel();
            using (dataDataContext _context = new dataDataContext())
            {
                return model = (from r in _context.Registrations
                                where r.RID == Id
                                select new RegisterModel
                                {

                                    ID = Id,
                                    Name = r.REName,
                                    Address = r.REAddress,
                                    PhoneNo = r.REPhoneNo
                                }).FirstOrDefault();
            }
        }
于 2013-08-23T05:54:42.120 に答える