0

問題

検索条件要素を一覧表示し、ユーザーが要素をクリックしてその検索条件を削除できるようにする検索結果ページがあります。

条件要素の 1 つを初めてクリックして削除すると、すべてが期待どおりに機能します。

ただし、条件要素が 2 回目に削除されると、最初に削除された要素が元に戻ります。

検索条件: {topic: "abuse"}, {profession: "admin"}, {keywords: "animal"}

「トピック」要素をクリックして削除すると、結果ページが表示されます{profession: "admin"}, {keywords: "animal"}

「キーワード」をクリックして削除すると、ページが正しく表示されなくなりました{topic: "abuse"}, {profession: "admin"}

この時点での正しい表示は、単一のタグのみである必要があります{profession: "admin"}

コード

SearchController.Results()

<HttpPost>
<NoCache>
Function Results(ByVal model As SearchCriteria) As ActionResult

    Dim resultsModel As SearchResultsModel = New SearchResultsModel
    Dim searchQuery As IQueryable(Of [Class]) = Nothing
    Dim searchResults As List(Of [Class]) = Nothing
    Dim categoryValueQuery As IQueryable(Of CourseCategoryValue) = Nothing
    Dim query As IQueryable(Of [Class]) = Nothing
    Dim queries As List(Of IQueryable(Of [Class])) = New List(Of IQueryable(Of [Class]))

    model = RemoveCriteria(model)
    model.RemovalCriteria = String.Empty

    resultsModel.Criteria = model
    Return View(resultsModel)
End Function

SearchController.RemoveCriteria()

<NonAction>
    Function RemoveCriteria(ByVal model As SearchCriteria) As SearchCriteria

        Dim result As SearchCriteria = ObjectMapper.Duplicate(model)

        If Not String.IsNullOrEmpty(result.RemovalCriteria) Then
            Select Case result.RemovalCriteria.ToLower.Trim
                Case "title"
                    result.Title = String.Empty

                Case "keywords"
                    result.Keywords = String.Empty

                Case "healthtopic"
                    result.HealthTopic = String.Empty

                Case "city"
                    result.City = String.Empty

                Case "profession"
                    result.Profession = String.Empty

            End Select
        End If

        Return result

    End Function

結果.vbhtml

@Imports System.Reflection
@ModelType SearchResultsModel

@Code
    ViewData("Title") = "Results"
    Dim properties As List(Of PropertyInfo) = Model.Criteria.GetType.GetProperties.ToList
    Dim names() As String = {"keywords", "healthtopic", "profession"}
End Code

<h2>Results</h2>

@If (Not Nothing Is Model) AndAlso (Not Nothing Is Model.Results) Then
    @<h3>Displaying @Model.Results.Count of @Model.ResultCount classes</h3>
End If
@Using Html.BeginForm("Results", "Search", Nothing, FormMethod.Post, New With {.id = "removalForm"})
    @Html.Hidden("RemovalCriteria", String.Empty, New With {.id = "removalCriteria"})
    @<div>
        <span style="font-weight: bold;">Search Criteria  </span>
        @For Each name As String In names
        Dim prop As PropertyInfo = (From p In properties Where p.Name.ToLower = name Select p).FirstOrDefault
        Dim value As Object = prop.GetValue(Model.Criteria)
        If Not Nothing Is value Then
            value = value.ToString
            If Not String.IsNullOrEmpty(value) Then
            @<span class="criteriaTag" title="click to remove" onclick="submitRemovalForm('@prop.Name');">@prop.Name<span class="criteriaValue">@value</span></span>
            End If
        End If
            @Html.Hidden(prop.Name, value)
    Next
    </div>
End Using
<script type="text/javascript">
    function submitRemovalForm(removeTag) {
        $('#removalCriteria').val(removeTag);
        $('#removalForm').submit();
    }
</script>

では、なぜこれが起こっているのかについて何か考えはありますか?

4

1 に答える 1

2

私はあなたのコードがどのように機能するかを突き刺すつもりです。正しければ、あなたの問題があると思います. 各基準について、非表示フィールドに出力しているようです。フィールドをクリックすると、非表示の removeTag フィールドにその値が追加され、フォームが送信されます。送信すると、そのフィールドが検索クエリから除外されます。それが正しければ、次のようになります。

実際のフォームでプロパティ隠し入力を削除していません。フォームの HTML マークアップは、おそらく次のようになります。

<form>
  <input type="hidden" name="RemovalCriteria" value=""/>
  <input type="hidden" name="topic" value="abuse"/>
  <input type="hidden" name="profession" value="admin"/>
  <input type="hidden" name="keywords" value="animal"/>
</form>

したがって、送信すると、フォームの送信時に次のようなものが得られます。

{
    RemovalCriteria:  "abuse",
    topic: "abuse", 
    profession: "admin",
    keywords: "animal"
}

次に「admin」タグの削除をクリックすると、フォーム送信は次のようになります。

{
    RemovalCriteria:  "admin",
    topic: "abuse", 
    profession: "admin",
    keywords: "animal"
}

したがって、悪用が再び追加されます。以前に削除されたタグが戻ってくるのを防ぐには、それに関連付けられている非表示の入力も実際に削除する必要があります。

<script type="text/javascript">
    function submitRemovalForm(removeTag) {
        $('#removalCriteria').val(removeTag);
        $('#removalForm').remove($("input[type='hidden'][name='" + removeTag + "']"));
        $('#removalForm').submit();
    }
</script>

remove topic タグをクリックすると、フォームのマークアップが次のように変更されます。

<form>
  <input type="hidden" name="RemovalCriteria" value="abuse"/>
  <input type="hidden" name="profession" value="admin"/>
  <input type="hidden" name="keywords" value="animal"/>
</form>

これが検索にどのように影響するか (プロパティ/タグの組み合わせがない場合) については、解決する必要があるかもしれませんが、影響がない可能性があります。しかし、それが削除されたタグが戻ってきた理由のようです.

于 2013-08-29T18:27:13.950 に答える