MVC部分视图问题

jpa*_*h78 5 c# ajax asp.net-mvc asp.net-mvc-4

我是MVC的新手,我想弄清楚是否有更好的方法来做到这一点.我有一个文本框供用户放入他们的搜索,然后基于该搜索我在搜索框下面显示一些结果.我试图避免在我的视图中有如此多的代码逻辑,并想知道是否有更好的方法来处理它.这是我现有的代码,根据"Model.Results"的值,如果我的其余逻辑通过,它将返回3个部分视图或按钮之一:

@section CustomerPrefixInfo
{
    @if (Model.Results == PrefixSearch.SearchResults.CustomerFound)
    {
        @Html.Partial("_CustomerPrefixInfo")
    }
    @if (Model.Results == PrefixSearch.SearchResults.PrefixResultsFound)
    {
        @Html.Partial("_PrefixResults")
    }
    @if (Model.Results == PrefixSearch.SearchResults.AnimalsFound)
    {
        @Html.Partial("_AnimalSearchResults")
    }
    @if (Model.Results == PrefixSearch.SearchResults.ValidNewPrefix)
    {
        using (Html.BeginForm("Index", "PrefixManagement", new { prefix = Model.AnimalPrefix.Prefix, dbPrefix = Model.AnimalPrefix.DbPrefix }))
        {
            <fieldset>
                <input id="btnReservePrefix" type="submit" value="Reserve Prefix" />
            </fieldset>
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将它放在一个控制器中,以便它只返回要显示的视图,然后只在页面上显示该视图.在做了一些rearch之后,我想使用Ajax.BeginForm并将InsertionMode设置为InsertAfter就可以了:

@using (Ajax.BeginForm("GenericSearch", "Home", FormMethod.Post, new AjaxOptions { InsertionMode = InsertionMode.InsertAfter, UpdateTargetId = "searchResults" }))
{
    <fieldset>
        <input id="btnPrefixSearch" type="submit" value="Prefix Search/Validate"/>
        @Html.EditorFor(model => model.Input)
    </fieldset>
    <div id="searchResults">

    </div>
}
Run Code Online (Sandbox Code Playgroud)

然后,我的GenericSearch Action使用开关来决定返回哪个部分视图:

public ActionResult GenericSearch(PrefixSearch prefixSearch)
{
    //some database logic here to get the results
    switch (prefixSearch.Results)
    {
        case PrefixSearch.SearchResults.CustomerFound:
            return PartialView("_CustomerPrefixInfo", prefixSearch);
        case PrefixSearch.SearchResults.PrefixResultsFound:
            return PartialView("_PrefixResults", prefixSearch);
        case PrefixSearch.SearchResults.AnimalsFound:
            return PartialView("_AnimalSearchResults", prefixSearch);
        default:
            return null;
     }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时,它将局部视图放在一个新页面上.

这是我的部分观点之一(它们都是3个与此大致相同)

@model MVC_Test_Project.Models.PrefixSearch

@{
    ViewBag.Title = "PrefixResults";
 }

@{
    Layout = null;
 }
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.PrefixResults[0].Prefix)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PrefixResults[0].CustomerCount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PrefixResults[0].Link)
        </th>
    </tr>

@foreach (var item in Model.PrefixResults)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Prefix)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CustomerCount)
        </td>
        <td>
            <a href="@item.Link">edit</a>               
        </td>
    </tr>
}
 </table>
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

编辑 只是一个有用的提示,如果有人犯了同样的愚蠢错误,请确保在脚本之前调用您的包.

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

当我提到使用那些时,我已经添加了最后两行,但是它们超出了我的捆绑....因此ajax因为它而无效.感谢各位帮助,一切都很好! - 约瑟夫

Eri*_*ips 2

我想将其放入控制器中,以便它只返回视图

看起来很简单:

视图模型:

public class MyModel
{
  public string PageToRender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器动作

public ActionResult DoLogic()
{
  //var Results = ?? as The ENum

  switch(Results)
  {
    PrefixSearch.SearchResults.CustomerFound:
      model.PageToRender = "_CustomerPrefixInfo";
    // etc etc
  }    

  return View(model);
}
Run Code Online (Sandbox Code Playgroud)

看法:

 @{if (!string.IsNullOrEmpty(model.PageToRender))
   Html.RenderPartial(model.PageToRender);}
Run Code Online (Sandbox Code Playgroud)

虽然我可能会装饰枚举:

public enum SearchResults
{
  [Display(Name="_CustomerPrefixInfo")]
  CustomerFound
}
Run Code Online (Sandbox Code Playgroud)

然后就没有 switch 语句,你只需获取枚举值显示属性的 name value