2

私は MVC を使用して Web アプリに取り組んでおり、すべてのページに 3 つのドロップダウン、1 つのテキスト ボックス、1 つの画像ボタンで構成されるヘッダー セクションがあります。そのため、ユーザーがどのページにいても、3 つのドロップダウンから組み合わせを選択し、テキスト ボックスにテキストを入力し、画像ボタンを押してデータベースを検索することができます。

したがって、強く型付けされた (BaseViewModel) マスター _Layoutthought を使用して、2 つの部分ビューを追加します。1 つはユーザー情報を表示し、もう 1 つはすべてのドロップダウン、テキスト ボックス、およびイメージ ボタンを表示します。モデルには、ドロップダウン オプション/アイテムごとに 3 つのモデルがあり、次に、各モデルのリストとして 3 つのプロパティと、選択したアイテム ID を保持する 3 つの int プロパティを持つ BaseViewModel があります。そして、このbaseViewModelをすべてのビューモデルの親クラスとして使用して、リクエストとレスポンスごとに強く結び付けられた_Layoutをフルフィルできるようにする予定です。OK、私の要件を明確に説明したかどうかはわかりません:(。

すべてのモデルのコードは次のとおりです。

    namespace XYZNameSpace.Models
{
    public class ManageCompany
    {
        public long ManageCompanyID { get; set; }

        public string ManageCompanyName { get; set; }
    }
}

    namespace XYZNameSpace.Models
{
    public class SuperCompany
    {
        public long SuperCompanyID { get; set; }

        public string SuperCompanyName { get; set; }
    }
}

    public class User
{
    public long UserID { get; set; }

    public string UserName { get; set; }

    public string UserLoginName { get; set; }

    public string UserLevel { get; set; }

    public int UserLevelId { get; set; }
}

    namespace XYZNameSpace.Models
{
    public class SearchResult
    {
        public string CompanyName { get; set; }

        public string SubCompanyName { get; set; }

        public string UserName { get; set; }
    }
}

ビューモデル

    namespace XYZNameSpace.ViewModels
{
    public class BaseViewModel : User
    {
        public long SelectedManageCompanyID { get; set; }

        public List<SelectListItem> ManageCompanyList { get; set; }

        public string SelectedManageCompanyName { get; set; }

        public long SelectedSuperCompanyID { get; set; }

        public List<SelectListItem> SuperCompanyList { get; set; }

        public string SelectedSuperCompnayName { get; set; }

        public int SelectedSearchOptionID { get; set; }

        public List<SelectListItem> SearchOptionsList { get; set; }

        public string SelectedSearchOptionName { get; set; }

        public string SearchWord { get; set; }
    }

    public class SearchOption
    {
        public int SearchOptionID { get; set; }

        public string SearchOptionName { get; set; }
    }
}

    namespace XYZNameSpace.ViewModels
{
    public class SearchResultsViewModel : BaseViewModel
    {
        public List<SearchResult> ResultsList { get; set; }
    }
}

コントローラ

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Home()
    {
        BaseViewModel bVM = new BaseViewModel()
        {
            ManageCompanyList = (new List<ManageCompany>() {
                new ManageCompany()
                {
                    ManageCompanyID = 1,
                    ManageCompanyName = "MC 1"
                },
                                    new ManageCompany()
                {
                    ManageCompanyID = 2,
                    ManageCompanyName = "MC 2"
                },
                                    new ManageCompany()
                {
                    ManageCompanyID = 3,
                    ManageCompanyName = "MC 3"
                },
                                    new ManageCompany()
                {
                    ManageCompanyID = 4,
                    ManageCompanyName = "MC 4"
                },
                                    new ManageCompany()
                {
                    ManageCompanyID = 5,
                    ManageCompanyName = "MC 5"
                }
             }).Select(x => new SelectListItem { Value = x.ManageCompanyID.ToString(), Text = x.ManageCompanyName }).ToList(),
            SuperCompanyList = (new List<SuperCompany>(){
             new SuperCompany(){
                SuperCompanyID=6,
                SuperCompanyName="SC 6"
             },
             new SuperCompany(){
                SuperCompanyID=7,
                SuperCompanyName="SC 7"
             },
             new SuperCompany(){
                SuperCompanyID=8,
                SuperCompanyName="SC 8"
             },
             new SuperCompany(){
                SuperCompanyID=9,
                SuperCompanyName="SC 9"
             },
             new SuperCompany(){
                SuperCompanyID=10,
                SuperCompanyName="SC 10"
             }
             }).Select(y => new SelectListItem { Value = y.SuperCompanyID.ToString(), Text = y.SuperCompanyName }).ToList(),

            SearchOptionsList = (new List<SearchOption>(){
             new SearchOption(){
                SearchOptionID=11,
                SearchOptionName="SO 11"
             },
             new SearchOption(){
                SearchOptionID=12,
                SearchOptionName="SO 12"
             },
             new SearchOption(){
                SearchOptionID=13,
                SearchOptionName="SO 13"
             },
             new SearchOption(){
                SearchOptionID=14,
                SearchOptionName="SO 14"
             },
             new SearchOption(){
                SearchOptionID=15,
                SearchOptionName="SO 15"
             }
             }).Select(y => new SelectListItem { Value = y.SearchOptionID.ToString(), Text = y.SearchOptionName }).ToList()
        };

        return View(bVM);
    }

    [HttpPost]
    public ActionResult Search(BaseViewModel bVM)
    {
        SearchResultsViewModel sRVM = new SearchResultsViewModel();
        sRVM.ResultsList = new List<SearchResult>(){
            new SearchResult()
            {
             CompanyName = bVM.SelectedSuperCompanyID.ToString(),
             SubCompanyName = bVM.SelectedManageCompanyID.ToString(),
             UserName = "Duh"
            }
        };
        return View("SearchResults", sRVM);
    }
}

ビュー /Home/Home.cshtml

@{
    ViewBag.Title = "Home";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div style="float: left; vertical-align: top;">

</div>
<br />

/Home/SearchResults.cshtml

@model XYZNameSpace.ViewModels.SearchResultsViewModel
<table width="100%">
    <thead>
        <tr>
            <td>
                COMPANY
            </td>
            <td>
                SUB COMPANY
            </td>
            <td>
                USER NAME
            </td>
        </tr>
    </thead>
    <tbody>
        @foreach (XYZNameSpace.Models.SearchResult sr in Model.ResultsList)
        {
            <tr>
                <td>
                    @sr.CompanyName
                </td>
                <td>
                    @sr.SubCompanyName
                </td>
                <td>
                    @sr.UserName
                </td>
            </tr>
        }
    </tbody>
</table>

/Shared/SearchDDLPartialView.cshtml

    @model XYZNameSpace.ViewModels.BaseViewModel
<div>
    <div style="float: left">
        <span class="Label">Search: </span>
        @using (Html.BeginForm("Search", "Home", FormMethod.Post))
        {
            @Html.DropDownListFor(x => x.SelectedSuperCompanyID, Model.SuperCompanyList)
            @Html.DropDownListFor(x => x.SelectedManageCompanyID, Model.ManageCompanyList)
            @Html.DropDownListFor(x => x.SelectedSearchOptionID, Model.SearchOptionsList)
            <input type="image" src="../../Content/images/search.gif" />

        }
    </div>
</div>

/共有/_Layout.cshtml

@model XYZNameSpace.ViewModels.BaseViewModel
<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <link href="@Url.Content("~/Content/BEClientProfile.css")" rel="Stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>
<body>
    <table>
        <tr>
            <td>
                <img src="../../Content/images/logo124.gif" alt="Logo" />
            </td>
            <td valign="top">
                <div style="float: left; vertical-align: top; text-align: left">
                    <img src="../../Content/images/user-info.gif" alt="User Infor" />
                    <span class="Label">Welcome </span><span class="HeaderLabelText">@Model.UserLevel</span>
                </div>
                <div>
                    <div style="float: left; width: 100%;">
                        <u><span class="Label">Currently Editing:</span> </u>
                    </div>
                    <div style="float: left; width: 100%;">
                        <span class="Label">Company:</span> <span class="HeaderLabelText">@Model.SelectedManageCompanyID</span>
                    </div>
                    <div style="float: left; width: 100%;">
                        <span class="Label">User:</span> <span class="HeaderLabelText">@Model.UserLoginName</span>
                    </div>
                </div>
            </td>
            <td>
            </td>
            <td>
                @{Html.RenderPartial("SearchDDLPartialViews", Model);}
            </td>
        </tr>
        <tr>
            <td colspan="4">
                @RenderBody()
            </td>
        </tr>
    </table>
</body>
</html>

/Shared/UserPartialView.cshtml

@model XYZNameSpace.Models.User
<div style="float: left; margin-left: .5em;">
    <img src="../../Content/images/user-info.gif" alt="User Infor" />
    <span style="font-weight: bold; float: left;">Welcome </span>
</div>

OK、各ドロップダウンから 1 つの項目を選択できましたが、ホーム コントロールの検索アクションで画像ボタンをクリックすると、BaseViewModel には selectedID 以外の何もないため、アクションが SearchResults ビューを表示しようとすると、それらは _Layout.cshtml を介して表示されます。ドロップダウンで使用されるリストに何もないというエラー。

では、リクエストごとにこの情報を保持するにはどうすればよいでしょうか...?

4

1 に答える 1

1

簡単な解決策は、リスト < SelectListItem > またはビューモデル自体をセッションに保存し、ビューモデルを返すたびにそれらをビューに再導入することです。ただし、クラウドベースのソリューションの場合は同じ概念ですが、appfabric、memcache、または PaaS で許可されているその他のアドオンなど、他のキャッシュ ストレージを使用する必要があります。

于 2012-04-08T02:48:40.233 に答える