2016-12-04 4 views
1

私はif文を含むコントローラを持っていますが、両方とも同じ型を返すので、最初のブロックまたは2番目のブロックにヒットするかどうかは関係ありません。コントローラはPartialViewを返さない?

[HttpPost] 
public ActionResult Descriptions(string partsNo, Details searchValue) 
{ 
    var response = partsNo != null ? _referenceRepository.GetParts(partsNo) : _referenceRepository.SearchValue(searchValue); 

    return PartialView(response); 
} 

ビュー

@model ArrowEngineeringMVC.Models.Details 

<script> 
    $(document) 
     .on("click", 
      ".getPartNo", 
      function (e) { 
       var val = $(this).val(); 
       $.ajax({ 
        url: '/Home/Descriptions', 
        contentType: 'application/json', 
        type: 'POST', 
        data: JSON.stringify({ "partsNo": val }), 
        dataType: 'html' 
       }) 
        .success(function (result) { 
         $('#descriptionPlace').html(result); 
        }) 
        .error(function (xhr, status) { 
         alert(status); 
        }); 
      }) 
</script> 

@using (Html.BeginForm("Descriptions", "Home", FormMethod.Post)) 
{ 
    <div class="topBar"> 
     @Html.TextBoxFor(m => m.Type) 
     <input type="submit" id="submitId" value="submit"/> 
    </div> 
} 

    <div class="leftPanel"> 
     <button href="javascript:void(0)" id="NumbersButton" value="Number" class="getPartNo">#</button> 
     <button href="javascript:void(0)" value="A" class="getPartNo">A</button> 
     <button href="javascript:void(0)" value="B" class="getPartNo">B</button> 
     <button href="javascript:void(0)" value="C" class="getPartNo">C</button> 
    </div> 

    <div id="descriptionPlace"></div> 

あなたがいずれかのボタンをクリックした場合、それはif文の最初の部分を打つでしょう。これを行うと、PartialViewが返され、すべて正常に動作します。ボタンからの値はAJAXを使用してコントローラに渡されますが、検索を行うとモデルから渡されますが、これは唯一の違いです。

検索を行うと、部分的なビューを返さないifステートメントの2番目の部分にヒットします。何らかの理由で新しいビューが返されます。

変数のレスポンスはリストを返しますが、if文のどの部分がヒットしたかによって異なる値が含まれるだけなので、ちょっと混乱します。相続人

ちょうどそれが簡単に理解できるようにするreferenceRepositoryのビット:

public List<Parts> SearchValue(Details searchValue) 
{ 
    const string detailsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Type] = {0}"; 
    string queryDetails = string.Format(detailsSql, searchValue.Type); 

    var dbDetails = getConnection().Query<Parts>(queryDetails).ToList(); 

    return dbDetails; 
} 

public List<Parts> GetParts(string partNumber) 
{ 
    string partsSql; 
    if (partNumber == "Number") 
    { 
     partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number] not like '%[^0-9]%'"; 
    } 
    else 
    { 
     partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number] like '{0}%'"; 
    } 

    string queryParts = string.Format(partsSql, partNumber); 

    var dbParts = getConnection().Query<Parts>(queryParts).ToList(); 

    return dbParts; 
} 
+1

@GSerg詳細は、タイプと呼ばれるプロパティを含むオブジェクトです。コントローラ全体にモデルをポストしています。タイププロパティに値が設定されます。 –

+0

私はあなたのことを誤解したと思います。問題の説明。どうやら、フォームによって返された部分的なビューは、 '#descriptionPlace'に行くのとは対照的に、ページ全体を置き換えると言います。正しいですが、フォームを送信すると、ブラウザは新しいページとして返すものを表示します。それは "完全な"ビューではないことは知らない。フォームの結果を '#descriptionPlace'に入れるには、フォームの' submit'をインターセプトするか、 'Ajax.BeginForm'を適切なパラメータで使用する必要があります。 – GSerg

+0

@GSergああ、ありがとう、@ Html.BeginFormを使って#descriptionPaceにレンダリングする方法を知っていますか? –

答えて

0

あなたが提出する上#descriptionPlace divの中に同一の結果として、部分ビューをしたい場合は、この削除のように試すことができますclick.then formタグを使用し、submitボタンのclickイベントをgetnumbersボタンとともにバインドします。

値を1つだけ投稿する必要はありませんか?私は正しい?

divまたは特定の領域に部分的なビューをロードする場合は、ajax call.orのように言及する必要があります。@ Html.PartialまたはRenderPartial.Butを使用すると少し奇妙です。したがって、あなたはこのようにすることができます..

関連する問題