0

我有一个带有两个下拉列表的视图,用于搜索描述。结果列表现在显示在另一个视图中。我希望在同一个搜索视图中生成结果。我假设一些AJAXJquery可以用来解决这个问题,但不知道如何。那么,在这种情况下,如何将搜索结果显示在同一个视图页面中呢?

此外,我对Search controller. 我希望至少选择一个下拉列表(两个下拉列表都不应为空)。我怎样才能验证那部分?

看法

@using (Html.BeginForm("Search","Work",FormMethod.Get))
{

    <fieldset>
        <legend>Search</legend>
    <div class="editor-label">
            @Html.LabelFor(model => model.JobTypeID, "Job Type")
        </div>
        <div class="editor-field">
            @Html.DropDownList("JobTypeID", "Select Job Type")
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.JobPriorityID, "Job Priority")
        </div>
        <div class="editor-field">
            @Html.DropDownList("JobPriorityID", "Select Job Priority")
        </div>
         <p>
            <input type="submit" value="Search" />
        </p>
        </fieldset>
}

控制器:

 [HttpGet]
        public ActionResult Search(int? jobtypeid, int? jobpriorityid)
        {
            var vJobDescriptions = new List<JobDescription>();

            if (jobtypeid != null && jobpriorityid != null )
            {
                 vJobDescriptions = (from description in db.JobDescriptions
                                        where (description.JobTypeID == jobtypeid && description.JobPriorityID == jobpriorityid)
                                        select description).ToList();
            }
            else if (jobtypeid == null && jobpriorityid != null)
            {
                 vJobDescriptions = (from description in db.JobDescriptions
                                        where (description.JobPriorityID == jobpriorityid)
                                        select description).ToList();

            }
            else if (jobtypeid != null && jobpriorityid == null)
            {
                vJobDescriptions = (from description in db.JobDescriptions
                                    where (description.JobTypeID == jobtypeid)
                                    select description).ToList();
            }
            else
            {
                vJobDescriptions = (from description in db.JobDescriptions
                                    select description).ToList();
            }


            return View(vJobDescriptions);
        }
4

2 回答 2

0

一种可能性是使用 anAjax.BeginForm而不是普通形式(不要忘记在您的页面中包含jquery.jsjquery.unobtrusive-ajax.js脚本):

@using (Ajax.BeginForm("Search", "Work", new AjaxOptions { UpdateTargetId = "results" }))

那么您可以为我们在以下内容中指定的结果设置一个占位符UpdateTargetId

<div id="results"></div>

现在剩下的就是让您的 Search 控制器操作返回一个 PartialView 并将包含搜索结果的模型传递给它:

public ActionResult Search(int? jobtypeid, int? jobpriorityid)
{
    var model = ...
    return PartialView("_Result", model);
}

当然还有相应的_Result.cshtml部分:

@model IEnumerable<MyViewModel>
...

此外,我对搜索控制器有一些疑问。我希望至少选择一个下拉列表(两个下拉列表都不应为空)。我怎样才能验证那部分?

我建议您使用FluentValidation.NET,但如果您不想使用第三方库,您可以编写一个自定义验证属性来执行此验证,然后用它装饰绑定到您的下拉列表的 2 个视图模型属性之一.

不幸的是,如果您决定采用 AJAX 路由,则必须能够显示来自服务器的验证错误,以防出现问题。因此,必须将整个表单放入部分中。

您可以使用的另一种方法是使用没有 AJAX 的标准表单简单地重新加载整个页面。结果将作为初始视图模型的一部分作为集合属性,该属性最初为 null,执行搜索后,您将使用结果填充它。然后在视图中,您将测试该属性是否不为空,以及它是否不包含负责呈现结果的 Partial:

@using (Html.BeginForm("Search", "Work", FormMethod.Get))
{
    ...
}

<div id="results">
    @if (Model.Results != null)
    {
        @Html.Partial("_Results", Model.Results)
    }
</div>
于 2012-07-12T16:49:18.257 回答
0

一个基本的方法是把你的搜索结果的标记放到一个局部视图中,然后从你的SearchActionMethod 中返回它。这将要求您将搜索方法的最后一行更改为

return Partial(vJobDescriptions)

在您的客户端脚本中,您将执行以下操作:

var data = $("form").serialize();
$.get("/Search", data)
 .complete(function(results) { 
     $("form").replace(results) };

关于您正在寻找的验证方面,我会考虑将您的读取模型与搜索命令参数分开。

public ActionResult Search(SearchModel search)
{
     if (!ModelState.IsValid) // return view w/ invalid model
}

您的搜索参数模型将遵循以下原则:

[CustomValidation(typeof(SearchModel), 
                  "OneNotNullValidator", 
                  "One option must be selected"]
public class SearchModel 
{

     public int? JobTypeID { get; set;}
     public int? JobPriorityID { get; set;}

     public bool OneNotNullValidator()
     {
          return JobTypeID.HasValue || JobPriorityID.HasValue;
     }
}

CustomValidation我应用于该类的属性在特定语法和名称上可能不是 100% 正确,但我希望它的要点能够得到理解。

于 2012-07-12T16:56:07.523 回答