MVC,DropDownListFor在局部视图中,onchange应该在某处存储选定的值

时间:2014-06-13 09:31:47

标签: asp.net-mvc-4 partial-views

我的部分视图包含在我的_Layout.cshtml中。 此部分视图包含一个正确填充的下拉列表。

当用户选择一个值时,我希望该值在其他任何地方都可用。所以我尝试在会话数据中设置它。

工作正常。

部分观点:

@model MyModel

@using (Ajax.BeginForm("MySelection", "Home", new AjaxOptions()))
{
    var optionList = new SelectList(Model.Options, "Key", "Value");

    @Html.DropDownListFor(model => model.SelectedOption, optionList, 
    "--Select--", new { onchange = "this.form.submit(); return false;" })    
}

而且,果然,

    [HttpPost]
    public PartialViewResult MySelection(MyModel model)
    {
        Session["MySelection"] = model.SelectedOption;
        return PartialView("_MyPartial", model);
    }

获取匹配,设置会话数据,并返回部分视图。

然而......部分视图全部我明白了!

,而不是停留在同一页面上,只显示部分视图。

我正在试图找出如何只是简单地将所选值存储到我的会话数据中,我不需要有视图,部分视图或任何返回的内容,我不需要重新加载数据,重新加载页面,重定向到任何地方。

是什么<(无疑是非常简单!)在我的会话数据中获取所选选项的方式?


正如Ehsan Sajjad建议的那样,确保其他所有内容都到位后,使用(隐藏)按钮提交表单将执行ajax请求,而onchange处理程序中的this.form.submit则不会!

简而言之,现在我有了:

@model MyModel

@using (Ajax.BeginForm("MySelection", "Home", new AjaxOptions()))
{
    var optionList = new SelectList(Model.Options, "Key", "Value");

    @Html.DropDownListFor(model => model.SelectedOption, optionList, 
    "--Select--", new { onchange = "submitButton.click();" }) 
    <input type="submit" id="submitButton" class="hidden-button"/>   
}

[HttpPost]
public void MySelection(MyModel model)
{
    Session["MySelection"] = model.SelectedOption;
}

它就像一个魅力。

2 个答案:

答案 0 :(得分:2)

如果您不想返回任何内容,请返回EmptyResult:

[HttpPost]
public ActionResult MySelection(MyModel model)
{
  Session["MySelection"] = model.SelectedOption;
  return new EmptyResult();
}

反过来也可以使用AjaxOptions,在主视图中创建一个容器div:

<div id="container">

</div>



  @using (Ajax.BeginForm("MySelection", "Home", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "conatainer" }))
 {
  var optionList = new SelectList(Model.Options, "Key", "Value");

   @Html.DropDownListFor(model => model.SelectedOption, optionList, 
   "--Select--", new { onchange = "this.form.submit(); return false;" })
 }

你可以返回这样的空内容:

[HttpPost]
public ActionResult MySelection(MyModel model)
{
   Session["MySelection"] = model.SelectedOption;
   return Content("");
}

更新:

您需要添加一个隐藏的提交按钮,并在下拉索引更改时以编程方式触发其点击,因为以编程方式提交表单不会触发原始提交,因此发布的表单不会通过ajax发布并且会发回完整的帖子。

答案 1 :(得分:1)

视图必须对返回的数据执行某些操作。而且由于你还没有告诉它如何处理它,它采用了用返回值替换当前目标的默认行为。

onChange的{​​{1}}事件调用如下函数怎么样:

dropdown

javascript并不完全干净,因为我已经从我们已经实现的“参数化”版本中快速采用了它,但它应该给你一个大概的想法。