【问题标题】:In MVC Razor how to access selected drop-down value from layout in multiple controllers在 MVC Razor 中,如何从多个控制器的布局中访问选定的下拉值
【发布时间】:2014-03-12 14:30:19
【问题描述】:

问题陈述:

如何在视图中执行 CRUD 操作时从多个控制器的布局中访问选定的下拉值。

Layout.cshtml 中的下拉列表:

<li>@Html.Action("Index", "LanguageDropdown", new { languageid = Request["languageId"] })</li>

下拉的部分视图:

@model ALCMS.Web.Models.Master_or_Configuration.LanguageDropdownModel
    <script type="text/javascript">
        function GetLanguage() {
            var languageId = $('#LanguageId').val();
            var Url = "@Url.Content("~/MasterConfigGeneral/GetLanguage")";
            $.ajax({
                url: Url,
                dataType: 'json',
                data: { LanguageId: languageId },
                success: function (data) {
                }
            });
        }
        </script>
    <div style="display:inline-block">

   @Html.DropDownListFor(l => l.LanguageID, new SelectList(Model.Languages, "Value", "Text"), "Select Language", new { id = "LanguageId" ,onchange="GetLanguage()" })
        </div>

部分视图控制器:

public ActionResult Index(string languageId)
    {
        //return View();

        var languages = dbEntity.LookupLanguages;
        var model = new LanguageDropdownModel
        {
            LanguageID = languageId,
            Languages = languages.ToList().Select(l => new SelectListItem
            {
                Value = Convert.ToString(l.LanguageID),
                Text = l.Name
            })
        };
        return PartialView(model);
    }

现在在另一个控制器中,例如:Test.Controller 我想在 Actionresult 方法下访问它

Public ActionResult Create(LanguageDropdownModel objDropdown)
{
//I want to access the dropdown value languageId from the layout
} 

建议我一些方法来做到这一点???

本题参考(接上一题): Click here to see previous question

【问题讨论】:

  • 你试过什么??你应该可以像以前一样通过 ID 调用,因为布局会在页面上呈现 HTML。
  • 您的问题缺乏上下文。通常,除非您使用 Ajax,否则不会访问视图中的值,如果您使用的是 ajax,您只需像访问任何其他 HTML 控件一样访问它。它与 MVC 无关,因为只有 JavaScript使用最终生成的 HTML。
  • @ErikFunkenbusch-抱歉我的错误。我没有编写控制器,而是编写了视图。我想访问在其中一个控制器的布局中定义的选定下拉值。
  • @Anon-我已经更新了我的问题,给我一些建议。
  • @ErikFunkenbusch-我已经更新了我的问题,建议我采取一些方法。

标签: jquery .net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

您可以使用 Session 来存储您的下拉值。

通过查看您之前的问题,您似乎在更改下拉列表的值时在控制器端调用以下函数。因此,现在在此函数中将您的语言保存在会话中,然后在每个控制器中使用该会话值。我认为这应该适合你。

public JsonResult GetLanguage(int languageID)
{
    // Save LanguageId in Session here
    Sessions.LanugageID = languageID

    JsonResult jsResult = new JsonResult();
    objdbGlobalTenant.ddlLanguage = (from lsr in dbEntity.LocaleStringResources
                                     where lsr.LanguageID == languageID

                                     select new SelectListItem()
                                     {
                                         Text = lsr.ResourceValue,
                                         Value = lsr.ResourceName

                                     }).Distinct().ToList<SelectListItem>();

    //ViewBag.Language = objdbGlobalTenant.ddlLanguage;
    jsResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

    return jsResult;
}

【讨论】:

  • -谢谢我能够通过所有控制器中的会话访问布局下拉值。还有一个疑问,我可以将 GetLanguage() 方法的输出(资源值和资源名称)放在一个会话中并访问这些当我加载一些其他视图时的值???
  • 是的。你能行的。您可以将整个对象存储在 Session 中。但我不建议这样做,因为它对应用程序来说非常繁重。如果这确实解决了您的问题,请不要忘记将其标记为答案。所以它会在未来帮助其他用户。更多阅读请通过stackoverflow.com/questions/769338/…希望这有帮助
  • 感谢您的建议。我会浏览您分享的链接。
【解决方案2】:

您应该将它存储在 TempData 中,它曾经是只读的,但是如果您希望它位于 TempData 中,可以选择保持它不动,TempData 内部使用 Sessions 但我更喜欢在 Session 上使用 TempData:

public JsonResult GetLanguage(int languageID)
{

    TempData["LanuguageID"] = languageID;

}

现在您可以像这样在其他一些控制器操作中访问它:

int languageId = (int)TempData["LanuguageID"];

读取后它在临时数据中将不再可用,它将被销毁,但如果需要,您可以通过像这样调用 keep 将其保留在临时数据中:

TempData.Keep("LanuguageID");

【讨论】:

  • @Ehsan-感谢您对使用 Tempdata 的建议
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多