如何在重新加载后将数据传递到局部视图

时间:2014-12-16 16:07:52

标签: javascript asp.net-mvc view partial

控制器:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class ExperimentalController : Controller
{
    public ActionResult ReloadTest1()
    {
        string temp = DateTime.Now.ToString();
        ViewBag.Time = temp;
        return View();
    }

    public PartialViewResult ReloadTest1Partial()
    {
        string temp = DateTime.Now.ToString();
        ViewBag.Time = temp;
        return PartialView();
    }
}

查看:

@{
    ViewBag.Title = "ReloadTest1";
    string time = this.ViewBag.Time;
    ViewData["date"] = time;

    ViewBag.TheTitle = "test";
}

<h2>ReloadTest1</h2>

<select id="iSelect" name="iSelect" >
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
</select>


<div id="myPartialViewContainer">
    @{Html.RenderPartial("_ReloadTest1Partial", null, new ViewDataDictionary { {"vb", ViewBag}});}
</div>

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script>
    $('#iSelect').on('change', function () {
        $("#myPartialViewContainer").load('@(Url.Action("ReloadTest1Partial", "Experimental", null, Request.Url.Scheme))')
    })
</script>

部分视图:

@{
    var vb = ((dynamic)ViewData["vb"]);
}

<div>
    <span>@vb.Time</span>
</div>

什么不行:

将viewbag / viewdata直接从控制器传递到局部视图,因为mvc不接受这种情况发生。

工作原理:

从上面的代码中可以看到,部分视图使用Html.RenderPartial方法获取数据ONCE,并且视图包传递下来。 重新加载确实可以在下拉列表中更改所选对象

需要什么:

我需要在重新加载或之后将数据传递给局部视图,这主要是测试设置,但我最终希望能够根据选择值更新表。

如果somone能够给我一个工作的例子,请这样做。

2 个答案:

答案 0 :(得分:0)

在您的控制器中,您可以使用ViewBag设置自定义值,但在您的视图中,您正在使用ViewData以及引用其他名称(您正在设置ViewBag的Time属性)控制器,但你期望视图中的ViewData的vb属性。

将您的视图更改为expect model:

@model MyModel
@{
    string time = "";
    if (ViewData["Time"] != null) 
    {
       time = ViewData["Time"];
    } 
}

<div>
    <span>@Model.Time</span>
</div>

更改控制器以通过它:

public ActionResult ReloadTest1()
{
    var model = new MyModel {Time = DateTime.Now.ToString()};
    return View(model);
}

public PartialViewResult ReloadTest1Partial()
{
    var model = new MyModel {Time = DateTime.Now.ToString()};
    return PartialView(model);
}

你掌握的视图文件将如下所示:

@model MyModel
<div id="myPartialViewContainer">
    @{Html.RenderPartial("_ReloadTest1Partial", model);}
</div>

创建你的模型:

public class MyModel
{
    public string Time {get;set;}
}

另一方面,最好使用强类型model代替ViewBagViewData,因为您可以获得编译错误和智能感知

答案 1 :(得分:0)

最终解决方案:

控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;

namespace RolloutTool.Controllers
{
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public class ExperimentalController : Controller
    {
        public ActionResult ReloadTest1()
        {
            var model = new RolloutTool.Models.ExperimentalViewModels.MyModel { Time = DateTime.Now.ToString() };
            string temp = DateTime.Now.ToString();
            ViewBag.Time = temp;
            ViewData["Time"] = temp;
            return View(model);
        }
        [HttpPost]
        public PartialViewResult ReloadTest1Partial(string test)
        {
            var model = new RolloutTool.Models.ExperimentalViewModels.MyModel { Time = DateTime.Now.ToString() };
            string temp = DateTime.Now.ToString();
            ViewBag.Time = temp;
            ViewData["Time"] = temp;
            return PartialView("_ReloadTest1Partial", model);
        }
        
        // GET: Experimental
        public ActionResult Experimental()
        {
            ViewBag.Message = "Your contact page.";
            ViewBag.TestValue = 10;
            string[] temp = { "alpha", "beta", "gamma", "delta" };
            ViewBag.names = temp;
            int temp2 = temp.Length;
            ViewBag.nameslength = temp2;

            return View();
        }

    }

}

查看:

@{
    ViewBag.Title = "ReloadTest1";
    string time = this.ViewBag.Time;
    ViewData["date"] = time;

    ViewBag.TheTitle = "test";

}

@model RolloutTool.Models.ExperimentalViewModels.MyModel

<h2>ReloadTest1</h2>

<select class="chosen-select" id="iSelect" name="iSelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
</select>

<div id="myPartialViewContainer">
    @{Html.RenderPartial("_ReloadTest1Partial", Model);}
</div>


@Styles.Render(
  "~/content/chosen/chosen.css",
  "~/content/chosen/prism.css",
  "~/content/chosen/style.css",
  "~/content/bootstrap.css",
  "~/content/Site.css")

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/chosen/chosen.jquery.js"></script>
<script src="~/Scripts/chosen/prism.js"></script>
<script>
    var config = {
        '.chosen-select': {},
        '.chosen-select-deselect': { allow_single_deselect: true },
        '.chosen-select-no-single': { disable_search_threshold: 10 },
        '.chosen-select-no-results': { no_results_text: 'Oops, nothing found!' },
        '.chosen-select-width': { width: "95%" }
    }
    for (var selector in config) {
        $(selector).chosen(config[selector]);
    }
</script>


<script src="~/Scripts/jquery-1.10.2.js"></script>
<script>
    $('#iSelect').on('change', function () {
        getPartial();
    })
</script>
<script>
    function getPartial() {
        var tempSelect = document.getElementById("iSelect");
        var tempResult = tempSelect.options[tempSelect.selectedIndex].text;
        $.ajax({
            url: "ReloadTest1Partial",
            type: "POST",
            data: {'test' = tempResult}, //if you need to post Model data, use this
            success: function (result) {
                $("#myPartialViewContainer").html(result).find("select").each(function () {
                $(this).chosen({});
            }
        });
    }
</script>

@{
    string time = "";
    string temp = "";
    if (ViewData["vb"] != null)
    {
        temp = "1";
        time = ((dynamic)ViewData["vb"]).Time;
    }
    else if (ViewContext.Controller.ViewBag.Time != null)
    {
        temp = "2";
        time = ViewBag.Time;
    }
    else if (ViewData["Time"] != null)
    {
        temp = "3";
        time = (string) ViewData["Time"];
    }
}
@model RolloutTool.Models.ExperimentalViewModels.MyModel
<div>
    <span>@time</span>
    <span>@Model.Time</span>
    <span>@temp</span>
</div>

<select class="chosen-select"></select>


<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/chosen/chosen.jquery.js"></script>
<script src="~/Scripts/chosen/prism.js"></script>

这会正确更新部分视图并重新加载所选择的选择下拉列表。 (见styles and scripts not working in partial view