1

所以,我正在使用 ASP.NET MVC 开发一个新项目。老实说,我之前对它(或任何 Web 开发)没有太多经验,所以这可能是一个简单的问题。

我有一个局部视图,它是一个在各种 Web 视图之间共享的搜索框。该视图有一个下拉列表和一个文本框。SearchFilterModel一旦用户发布表单(使用搜索按钮),我需要该值作为对象到达搜索控制器的索引操作。

现在,表单正在调用 Search 控制器上的 index 操作。这是有效的(见附件代码)。但问题是,索引方法的 id 参数(必须是 a SearchFilterModel)没有到达(它为空)。

我不知道如何将对象从表单传递到控制器。¿ 我做错了什么?

问题是如果我替换new { id = search }new { id = "something" }(更改发送参数的类型,然后一个字符串到达​​(它有效)或者如果我写然后一个 int 到达。我想有一些与不是本机类型new { id = 1 }的东西相关的东西,而是SearchFilterModel复杂的。

任何的想法?

@using Hermes.Models.Helpers

@{
    var search = CacheHelper.Instance.SearchFilter;
    using (Html.BeginForm("Index", "Search", new { id = search  }, FormMethod.Post))
    {
        @Html.ValidationSummary(true, "No se creó la cuenta. Corrija los errores e inténtelo de nuevo.")
        <div>
            <fieldset>
                <legend>Búsqueda por tipo de producto</legend>

                <div class="editor-label">
                    @Html.LabelFor(s => search.SearchFilter)
                    &nbsp;&nbsp;&nbsp;
                    @Html.DropDownListFor(s => search.SelectedSearchFilter, new SelectList(search.SearchFilter))
                    &nbsp;&nbsp;&nbsp;
                    @Html.LabelFor(s => search.SearchQuery)
                    &nbsp;&nbsp;&nbsp;
                    @Html.TextBoxFor(s => search.SearchQuery)
                    @Html.ValidationMessageFor(s => search.SearchQuery)
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="submit" value="Buscar" />
                </div>
            </fieldset>
        </div>
    }
}

搜索控制器的索引操作

[HttpPost]
        public ActionResult Index(SearchFilterModel id)
        {
            var x = CacheHelper.Instance.SearchFilter;

            ViewBag.Filter = id.SelectedSearchFilter;
            ViewBag.msg = String.Format("Se están buscando {0}, con el filtro {1}", id.SelectedSearchFilter, id.SearchQuery);
            ViewBag.ResultsCount = 0;

            return View();
        }

搜索过滤器模型

public class SearchFilterModel
{
    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "¿Qué características?")]
    public string SearchQuery { get; set; }

    [Required]
    [DataType(DataType.Text )]
    [Display(Name = "¿Qué buscar?")]
    public List<String> SearchFilter { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "¿Qué buscar?")]
    public string SelectedSearchFilter { get; set; }
}
4

3 回答 3

1

您必须构建一个语法与类定义匹配的 JSON,然后将此数据发送到您的操作,MVC 应该处理 JSON 到您的类的转换,或者您可以使用类的Deserialize方法JavaScriptSerializer并将对象创建为字符串.

因此,将事件处理程序绑定到您的提交函数,然后使用一些 ajax api 来发送数据。下面是一个使用 jquery 的例子:

var searchFilter=[];
for each( value in the dropdown)
   searchFilter.push(value);

var searchFilterModel={
SearchQuery: "value1", //get the data from the textbox
SelectedSearchFilter: "value2", //get the value from dom
SearchFilter: searchFilter
}

$.ajax(
{
url: url //your action method
data: {
SearchFilterModel:searchFilterModel
},
success:function(){} //callback function
})

动作签名保持不变。

并使用 JavaScriptSerializer 方法:

var searchFilter=[];
for each( value in the dropdown)
   searchFilter.push(value);

var searchFilterModel={
SearchQuery: "value1", //get the data from the textbox
SelectedSearchFilter: "value2", //get the value from dom
SearchFilter: searchFilter
}

$.ajax(
{
url: url //your action method
data: {
id1: searchFilterModel
},
success:function(){} //callback function
})

[HttpPost]   
public ActionResult Index(string id1)
{
var id=new JavaScriptSerializer().Deserialize<SearchFilterModel>(id1);
var x = CacheHelper.Instance.SearchFilter;
ViewBag.Filter = id.SelectedSearchFilter;
ViewBag.msg = String.Format("Se están buscando {0}, con el filtro {1}", id.SelectedSearchFilter, id.SearchQuery);
ViewBag.ResultsCount = 0;
return View();
}

让我知道这是否适合你..

于 2012-05-05T05:18:36.720 回答
0

使用表单发布复杂对象时,属性“名称”与对象属性匹配很重要。

通过使用@Html.TextBoxFor(s => search.SearchQuery) mvc 将为您创建必要的属性。

并且您应该替换表单标签,因为表单包含创建对象所需的信息using (Html.BeginForm("Index", "Search", FormMethod.Post))

于 2012-05-05T11:03:11.390 回答
0

所有发布的答案都不起作用,所以最终解决方案是:

在“主页”控制器(其视图呈现“搜索”部分视图)中,我声明了一个新实例SearchViewModel,将其传递给“主页”视图(通过ViewBag)在“主页”视图上恢复它并将其传递给通过Render方法“搜索”部分视图:

SearchFilterModel searchFilter = ViewBag.SearchFilter;
@Html.Partial("SearchProduct", searchFilter)

现在,在“搜索”视图中,像往常一样声明 Begin 表单,现在它可以完美运行了。(对我来说)问题似乎与对象的生命周期有关(在我的问题和我最初的尝试中,我试图在表单之前声明它,在我看来,这是不可能的) . 现在,它工作得很好,但我担心这样做对性能的影响。任何建议将不胜感激。

于 2012-05-06T19:52:26.150 回答