Asp.net mvc 4 MVC,DropDownListFor在partialview中,一旦更改,应将所选值存储在某处_

Asp.net mvc 4 MVC,DropDownListFor在partialview中,一旦更改,应将所选值存储在某处_,asp.net-mvc-4,partial-views,Asp.net Mvc 4,Partial Views,我有一个包含在my_Layout.cshtml中的局部视图。 此局部视图包含一个Dropdownlist,该列表已正确填充 当用户选择一个值时,我希望该值在其他任何地方都可用。所以我试着在会话数据中设置它 那很好 局部视图: @model MyModel @using (Ajax.BeginForm("MySelection", "Home", new AjaxOptions())) { var optionList = new SelectList(Model.Options, "K

我有一个包含在my_Layout.cshtml中的局部视图。 此局部视图包含一个Dropdownlist,该列表已正确填充

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

那很好

局部视图:

@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"/>   
}

它就像一个符咒

如果不想返回任何内容,请返回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;" })
 }
更新:
您需要添加一个隐藏的提交按钮,并在下拉索引更改时以编程方式触发其单击,因为以编程方式提交表单不会触发原始提交,因此表单不会通过ajax发布,并且会发生完全回发。

视图必须对返回的数据进行处理。由于您没有告诉它如何处理它,因此它采用了默认行为,即用返回值替换当前目标

下拉列表的
onChange
事件调用如下函数如何:

[HttpPost]
public ActionResult MySelection(MyModel model)
{
   Session["MySelection"] = model.SelectedOption;
   return Content("");
}
function SaveMySelection(paramsToPassToServer) {
    var methodParam = JSON.stringify(paramsToPassToServer);
    var methodUrl = '@Url.Action("MySelection", "Home")';
    var requestType = //GET or POST;
    var successMethod = function (srvResponse) {
    //You can do some parsing of the returned json in case you want to
    //or just ignore the returned value
    }
    $.ajax({
        type: requestType,
        url: methodUrl,
        data: requestType == "POST" ? methodParam : decodeURIComponent($.parseJSON(methodParam)),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        processData: false,
        success: successMethod,
        error: FunctionToHandleOnError
    });
}

javascript并不是完全干净的,因为我很快就采用了我们已经实现的“参数化”版本,但它应该给您一个大致的概念。

如果我什么都不返回,我什么也看不到。字面上空白页。这是我的主要问题。数据到达控制器,但我的页面重定向到/Home/MySelection。这是我的部分视图,或者,如果我不返回任何内容,则为空页,或者如果我返回一个字符串,则为该字符串的值。是的,我包含了它们,与您的示例完全相同,只是我更正了“conatainer”。在这种情况下,它只更新了该容器div,而不是整个div,jquery-unobtrusive.ajax包含在您的页面回发或部分回发中吗?jquery-unobtrusive.ajax包含在BundleConfig:bundles.Add(新脚本包(“~/bundles/jqueryval”)。包含(“~/Scripts/jquery.unobtrusive*”)。在我的视图中显式包含它也没有帮助。它不仅更新了div,还“刷新”了整个页面:(这意味着你的表单是通过ajax发布的,它正在做回发我之前尝试过,但我的代码没有命中-现在我把它放在视图的顶部,它可以工作…有点。出于某种原因,当我使用表单提交时,我的模型正确填写了SelectedOption,但通过这个函数我收到了一个没有SelectedOption的模型(它是空的)。也尝试了使用数据类型文本,但没有成功。您必须将方法的返回更改为JSon才能使用此代码。无论返回类型如何,我从未将任何数据输入该方法。总之,我不需要返回任何内容,而隐藏的提交按钮只是额外的一行代码。无论如何,感谢您的努力!
function SaveMySelection(paramsToPassToServer) {
    var methodParam = JSON.stringify(paramsToPassToServer);
    var methodUrl = '@Url.Action("MySelection", "Home")';
    var requestType = //GET or POST;
    var successMethod = function (srvResponse) {
    //You can do some parsing of the returned json in case you want to
    //or just ignore the returned value
    }
    $.ajax({
        type: requestType,
        url: methodUrl,
        data: requestType == "POST" ? methodParam : decodeURIComponent($.parseJSON(methodParam)),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        processData: false,
        success: successMethod,
        error: FunctionToHandleOnError
    });
}