首页 > 解决方案 > 在 MVC5 中的 URL 中传递变量

问题描述

我正在编码 MVC5 和 C#。

我有一个索引视图,它只有一个由控制器填充的下拉列表 - 带有两个表字段(File_Desc 和 Track_Nmbr)。当用户从下拉列表中选择 File_Desc 时,它会触发 javascript 重定向并将 Track_Nmber 作为“关键字”传递给名为“列表”的视图。然后列表显示数据库中具有相同 Track_Nmbr 的所有项目。这部分都按设计工作。

我迷路的地方是下一步。在 LIST 视图中,用户查看当前项目后,可以输入与此 Track_Nmbr 关联的新项目。因此,我希望 Create View 打开并预填充 Track_Nmbr 字段。

我可以从索引视图下拉列表中轻松获取 TRACK_NMBR 并将其传递给列表视图。但是我如何再次将它传递给创建视图?因为我不能再从下拉列表中抓取它。

我一直在寻找和阅读,但时间至关重要。我仍然会继续寻找信息并尽力解决它,但我在砖墙上。我对 MVC5 很陌生。

我将分享我所有的代码,这样你就可以看到我到目前为止是如何设置的。我正在寻找最简单的解决方案来打开创建视图并预填充 TRACK_NMBR 字段。

代码:索引控制器

   public ActionResult Index()
    {

        // Create Drop Down List from Data_Catalog

        {
            List<SelectListItem> testList = db.DATA_CATALOG.Select(x => new SelectListItem { Value = x.TRACK_NMBR.ToString(), Text = x.FILE_DESC, Selected = false }).DistinctBy(p => p.Text).ToList();
            ViewBag.testList = new SelectList(testList, "Value", "Text");
            return View();
        }

        // End Drop Down List

    }

代码:索引视图

@section scripts{

<script type="text/javascript">
    $(document).ready(function () {

        $("#testList").on("change", function () {
            window.location.href = "@Url.Action("Create")?keyword=" + $("#testList").val();



        });
    })

</script>
}

@Html.DropDownList("testList", null, "Select File")

代码:列表控制器

 public async Task<ActionResult> List(string searchString, int keyword)


    {

            //Pass TRACK_NMBR to LIST via url

            TRACK_NMBR_ViewModel vm = new TRACK_NMBR_ViewModel();
            vm.TRACK_NMBR = keyword;


        var catalogs = from m in db.FILE_RCPTS_LOG
                       select m;
        {
            catalogs = catalogs.Where(s => s.TRACK_NMBR.Equals(keyword));
        }

        return View(await catalogs.ToListAsync());

        }

 public class TRACK_NMBR_ViewModel
    {
        public int TRACK_NMBR { get; set; }
        public string DISPOSITION { get; set; }
        public DateTime DISPOSITION_DT { get; set; }
        public string PROCESSED_BY { get; set; }
        public DateTime DT_PROCESSED { get; set; }
        public string TIMEFRAME_DESC { get; set; }
        public string DTF_FILE_NAME { get; set; }
    }

代码:列表视图

@section scripts{
<script type="text/javascript">
    function myFunction () {
        window.location.href = "@Url.Action("Create")?keyword=" + $("#testList").val();      
    }

</script>
}

 @Html.ActionLink("Create New", "Create")


@Html.CheckBox("someID", new { @onclick = "myFunction();", htmlAttributes = new { @class = "form-control" } })

如您所见,我在视图上放置了一个复选框。当用户单击框以添加新的 File_Desc。我想(再次)将关键字 (track_nmbr) 发送到创建视图并预填充 Track_Nmbr 字段。但是,我的关键字现在未定义。而且我不知道如何从 url 中获取它并将其传递给 Create View,就像我在 Index to List 视图中所做的那样。

如果我可以将带有关键字的 url 发送到 Create View,我可以得到其余的。

同样,MVC5 很新,我很头疼。C# 对我来说也是新的,因为我来自 VB.net 背景。但是,我发现使用 vb.net 在 MVC5 中找不到好的示例,因此我也在解决 c# 的学习曲线。

标签: javascriptc#asp.net-mvc-5

解决方案


您基本上需要将轨道号从您的List操作方法传递到视图,以便它可以用于创建Create链接 url,您可以在其中将轨道号值作为查询字符串项传递

由于您没有使用视图模型,因此可以使用 ViewBag 来传递此数据。

public async Task<ActionResult> List(string searchString, int keyword)
{
  //Your existing code
  ViewBag.Track = keyword;
  return View(await catalogs.ToListAsync());
} 

现在在您看来,您可以使用ActionLink采用路由值字典对象的重载之一。

@Html.ActionLink("Create New", "Create","Home",new { keyword = ViewBag.Track }, null)

这将创建一个带有 href 值的锚标记,该标记具有一个带有键的查询字符串项keyword,它的值将是您在List操作方法中收到的任何值。

确保您的Create操作方法具有接受查询字符串值的参数

public ActionResult Create(int keyword)
{
  // to do : use keyword value
  // to do : return something
}

推荐阅读