2

ユーザーが多くのフィルターを使用して、必要なものを正確に取得できるMVCアプリを構築しています。

コントローラー メソッドに基づくこれらのフィルターの概要を次に示します。

//
// GET: /Card/SearchIndex
public ActionResult SearchIndex(string objName, string objType, string objCostSymbol, string objCost, string powerSymbol,
                                        string powerValue, string ratingSymbol, string ratingValue, string ownerName, string objSet, 
                                        string objRarity, string addCostValue, int? objNumber,
                                        string addCostValue2, string addCostValue3, string addCostValue4, string addCostValue5, string addCostValue6,
                                        bool? blueColor, bool? redColor, bool? yellowColor, bool? purpleColor, bool? greyColor, bool? blackColor,
                                        bool? musicColor, bool? allColor)
        {
             // MORE CODE HERE...
        }

これらすべてのフィルターを処理する最善の方法と、指定されたパラメーターに基づいて objInfo のリストを取得する方法を知りたいです。一部の値が null になる可能性があることに注意してください。私がこれまでに行ったのは、できる限り「すべて」の objInfo をロードし、不要なアイテムを削除して並べ替えることだけです。これは、私の感覚では「スマートではない」ですが、MVC アプリは初めてで、これを行うためのより良い方法を見つけようとしています。

編集

データを生成するビューは次のとおりです。

@using System.Web.Mvc.Html
@model PagedList.IPagedList<MvcApp.Models.ObjInfo>

@{
    ViewBag.Title = "SearchIndex";
}

<h2>Objects Management</h2>

<p>
    @Html.ActionLink("Create New Obj", "Create")
    @using (Html.BeginForm()){
        <p>
            <label>
                Obj Colors : Check a box to search for a color.
            </label>
            All: @Html.CheckBox("allColor", true)<br/>
            Blue: @Html.CheckBox("blueColor", true)
            Red: @Html.CheckBox("redColor", true)
            Yellow: @Html.CheckBox("yellowColor", true) <br/>
            Purple: @Html.CheckBox("purpleColor", true)
            Grey: @Html.CheckBox("greyColor", true)
            Black: @Html.CheckBox("blackColor", true)
            Music: @Html.CheckBox("musicColor", true)
        </p>
        <p>
            <label>
                Obj Values: Select a value in the list below.
            </label>
            Obj Number: <input type="number" min="0" max="9999" name="cardNumber" value="int" style="width: 70px"/><br/>
            Additional Cost (contains): @Html.DropDownList("addCost", String.Empty) + @Html.DropDownList("addCost2", String.Empty)
            + @Html.DropDownList("addCost3", String.Empty) + @Html.DropDownList("addCost4", String.Empty)
            + @Html.DropDownList("addCost5", String.Empty) + @Html.DropDownList("addCost6", String.Empty)  <br/>
            Cost: @Html.DropDownList("objCostSymbol", "=") @Html.DropDownList("objCost", String.Empty)<br />
            Power: @Html.DropDownList("powerSymbol", "=") @Html.DropDownList("powerValue", String.Empty)<br/>
            Rating: @Html.DropDownList("ratingSymbol", "=") @Html.DropDownList("ratingValue", String.Empty)<br />
            <label>
                Obj Text: Write a name, part of a name, or a word.
            </label>
            Obj Name: @Html.TextBox("objName") <br/>
            Owner: @Html.TextBox("ownerName") <br />
            <label>
                Obj Categories: Select a category in the list below.
            </label>
            Type: @Html.DropDownList("objType","All") <br/>
            Obj Set: @Html.DropDownList("objSet", "All") <br/>
            Rarity: @Html.DropDownList("objRarity", "All")<br />
            <div class="float-right">
                <input type="submit" value="Filter" name="submitbutton">
            </div>
        </p>
    }
</p>
<span style="color:red; font-size: 1.7em; font-style: italic;">@ViewData["ErrorMessage"]</span>
<table>
    <tr>
        <th>Obj Name</th>
        <th>Obj Number</th>
        <th>Obj Color</th>
        <th>Additional Cost</th>
        <th>Cost</th>
        <th>Obj Type</th>
        <th>@Html.ActionLink("Power", "SearchIndex", new {sortOrder=ViewBag.PowerSortParm})</th>
        <th>@Html.ActionLink("Rating", "SearchIndex", new {sortOrder=ViewBag.RatingSortParm})</th>
        <th>Rarity</th>
        <th>Obj Set Name</th>
        <th>Owner Name</th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjColor)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjAddCost)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjCost)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjType)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjPower)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjRating)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjRarity)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjSet.m_ObjSetName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.m_ObjOwner)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.m_ObjID }) |
                @Html.ActionLink("Details", "Details", new { id=item.m_ObjID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.m_ObjID })
            </td>
        </tr>
    }
</table>

<div>
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount

    @if (Model.HasPreviousPage)
    {
        @Html.ActionLink("<<", "SearchIndex", new {page = 1, sortOrder = ViewBag.CurrentSort})
        @Html.Raw(" ")
        @Html.ActionLink("< Prev", "SearchIndex", new {page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort})
    }
    else
    {
        @:<<
        @Html.Raw(" ");
        @:< Prev
    }

    @if (Model.HasNextPage)
    {
        @Html.ActionLink("Next >", "SearchIndex", new {page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort})
        @Html.Raw(" ")
        @Html.ActionLink(">>", "SearchIndex", new {page = Model.PageCount, sortOrder = ViewBag.CurrentSort})
    }
    else
    {
        @:Next >
        @Html.Raw(" ")
        @:>>
    }
</div>

どんなアドバイスでも、私がより良い仕事をするのに役立ちます、ありがとう.

4

3 に答える 3

1

使わない理由ModelBinder。あなたのケースではとても便利だと思います。下記を参照してください:

_ 私はModel:

public class Employee
{
   public string Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public DateTime BirthDate { get; set; }
   public Address HomeAddress { get; set; }
}

および: ModelBinder_Employee

public class EmployeeBinder : IModelBinder {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
            var emp = new Employee {
                                       Id = controllerContext.HttpContext.Request.Form["Id"],
                                       FirstName = controllerContext.HttpContext.Request.Form["FirstName"],
                                       LastName = controllerContext.HttpContext.Request.Form["LastName"],
                                       BirthDate = new DateTime(int.Parse(controllerContext.HttpContext.Request.Form["year"]),
                                           int.Parse(controllerContext.HttpContext.Request.Form["month"]),
                                           int.Parse(controllerContext.HttpContext.Request.Form["day"]))
                                   };

            return emp;
        }
    }

次にController

public ActionResult Example(Employee emp) {
            return View(emp);
}

URL:http://localhost:1034/Home/Example?Id=1&LastName=lazycatit

于 2013-04-17T07:10:39.410 に答える
1

JavaScript でこれにどのように直面しますか? option次のようなオブジェクトを作成します

var op = {
   cardName : "..",
   cardType : "" ,
    ...
}

そしてそれを関数に渡します。正しい ?

も同じですC#Conditionsたとえば、次のようなクラスを定義します

public class Conditions {
    public string CardName {get;set;}
    public string CardType {get;set;}
    .. 
}

関数は、その型のプロパティの値を制御して、それに応じて動作します。

于 2013-04-16T20:19:03.783 に答える
0

これがあなたの問題を処理する方法です。

まず、検索パラメーターを使用して ViewModel を作成します。

public class FilterViewModel
{
    public string ObjName { get; set; }
    public string ObjType { get; set; }
    public string OtherType { get; set; }
}

コントローラーで、これをビューに渡します。

public virtual ActionResult SearchResults()
{
    return View(new FilterViewModel());
}

SearchResults.cshtml では、モデルを json にエンコードし、ajax 呼び出しを使用して結果をフィルター処理する必要があります。btnFilterResults id を持つボタンがあると仮定します。これは、ajax を使用して部分ビュー (テーブルである必要があります) から結果をロードします。

<script type="text/javascript">
     var dataViewModel = @Html.Raw(Json.Encode(Model));

    $("#btnFilterResults").click(function () {
        dataViewModel.ObjName = $("#objName").val(); //Make sure the ids corresponde to your html. 
        dataViewModel.ObjType = $("#objType").val();
        dataViewModel.OtherType = $("#otherType").val();

        $.ajax({
           url: "@Url.Action(MVC.ControllerName.GetSearchResults())",
           data: { viewModel: JSON.stringify(dataViewModel) },
           success: function(data) {
               $("#tableDiv").empty(); //
               $("#tableDiv").html(data);
           }
        });
    });
</script>

最後に、コントローラーで結果を取得できます。

[HttpGet]
public virtual ActionResult LoadTableReporteGeneral(string viewModel)
{
    var filterOptions = JsonConvert.DeserializeObject<FilterViewModel>(viewModel);
    var query = from t in db.YourTableName
                select t;
     //This returns an IQueryable with all of your data, no filtering yet.

     //Start filtering.
     if(!String.IsNullOrEmpty(filterOptions.ObjName))
     {
         query = query.Where(x => x.ObjName == filterOptions.ObjName);
     }  
     if(!String.IsNullOrEmpty(filterOptions.ObjType ))
     {
         query = query.Where(x => x.ObjType == filterOptions.ObjType );
     }  
     //and so on. 
     //Finally return a partial view with your table. 
     return PartialView(MVC.Shared.Views._YourTableName, query);
}

注: T4MVC と Json.Net パッケージを使用しています。

お役に立てれば。

于 2013-04-16T22:08:40.463 に答える