【问题标题】:Is it possible to pass variables from the controller to the view and create multiple different URLs?是否可以将变量从控制器传递到视图并创建多个不同的 URL?
【发布时间】:2014-06-04 15:28:06
【问题描述】:

我最近才开始使用 MVC。在我看来,我有一种情况,我需要为几个不同的地方创建几个不同的链接。目前我正在使用 switch 语句,使用它们的类型作为参数,并单独写出它们。此处示例:

switch (link.Type)
{ 
    case "type1": %>                                   
        <a href='<%= Url.RouteUrl("A", new { controller = "Controller1", action = "Action1", 
        param1 = x, param2 = y, newWindow = "yes" }) %>' target="_blank"><%: link.Name %></a> <%

    break;

    case "type2": %>
        <a href='<%= Url.RouteUrl("B", new { controller = "Controller2", action = "Action2", 
        param1 = x, param2 = y, newWindow = "yes" }) %>' target="_blank"><%: link.Name %></a> <%

    break;
}

从上面的示例可以看出,URL 之间只有非常小的变化。我相信我将拥有 10-20 种这些类型,显然我只会在页面上显示一次的解决方案将是理想的。

是否可以传入变量来替换“A”、“Controller1”、“Action1”?

EDIT1:Erik 已经解决了我的问题,但出于好奇,是否也可以通过变量提供参数名称?因此,我可以通过变量来决定“param2”或“param3”,而不是使用名为“param2”的参数?

EDIT2: 示例中的 x 和 y 是在点击 Url.RouteUrl 链接时使用的整数。

例如,我的应用程序中有两个参数,即 projectId 和 recordId。当用户单击链接时,他们将被带到不同的控制器/视图并从那里继续。 projectId在所有链接中都是一致的,但有时可能不是recordId,而是tableId,articleId等。有没有办法处理这些不同的参数?

【问题讨论】:

    标签: asp.net-mvc-3 model-view-controller


    【解决方案1】:

    MVC 是模型、视图和控制器的首字母缩写。控制器应该更频繁地创建一个模型并将其传递给视图:

    所以你可能有这样的类:

    public class IndexViewModel
    {
       public string SomeString { get; set; }
       public string Controller { get; set; }
       public string Action { get; set; }
    }
    

    然后是这样的控制器:

    public ActionResult Index()
    {
      var model = new IndexViewModel();
      model.SomeString = "A";
      model.Controller = "Controller1";
      model.Action = "Action1";
    
      return View(model);
    }
    

    然后是视图:

    @model IndexViewModel
    
    <a href='<%= Url.RouteUrl(Model.SomeString, 
      new { controller = Model.Controller, 
            action = Model.Action, 
            param1 = x, param2 = y, newWindow = "yes" }) %>' 
            target="_blank"><%: link.Name %></a>
    

    更新 1:您不能在匿名类的构造函数/初始化程序中为类赋值。

    var myvar = new MyClass;
    
    var myanon = new { x = 1, MyClass.Prop = 2 };
    //------------------------^
    // You can't do this, it doesn't make sense
    

    更新 2:UrlHelper.RouteUrl() Method 有许多覆盖。不要尝试为签名RouteUrl(String, Object) 动态创建对象,而是使用签名RouteUrl(String, RouteValueDictionary)

    型号:

    public class IndexViewModel
    {
       public string SomeString { get; set; }
       public RouteValueDictionary RouteValues { get; set; }
    }
    

    控制器:

    public ActionResult Index()
    {
      var model = new IndexViewModel();
      model.SomeString = "A";
      model.RouteValues = new RouteValueDictionary();
      model.RouteValues.Add("Controller", "Controller1");
      model.RouteValues.Add("Action", "Action1");
      model.RouteValues.Add("param1", x);
      model.RouteValues.Add("param2", y);
    
    
      return View(model);
    }
    

    查看:

    @model IndexViewModel
    
    <a href='<%= Url.RouteUrl(Model.SomeString, 
                              Model.RouteValues) %>' 
            target="_blank"><%: link.Name %></a>
    

    【讨论】:

    • 您的回答让我的代码走上了正轨,似乎解决了我的问题!附带说明一下,如果说我有一个没有 param2 但有 param3 的类型,有没有办法也将它作为变量提供?
    • 您可以随意扩展模型。您可以添加字符串列表、整数列表,以及任何您想要的。您是否在问,如何创建具有可选属性的模型,然后轻松使用正确的属性?
    • 我明白你的意思,虽然似乎引入类似的东西: param1 = x, Model.Param = y, newWindow = "yes" }) %>' 是嘘嘘,有错误提到匿名类型成员声明。
    • A.您不能在匿名类的构造函数/实例化过程中为实例化类的属性赋值(更新 1)。 B. 我不知道你的xy 值是从哪里来的。
    • 我对我原来的问题添加了一个编辑,希望能澄清我的意思。如果这不可能,那很好,拥有它会更好。
    【解决方案2】:
    public ActionResult Index()
        {
         var model = new IndexViewModel();
         ViewBag.Link1="A";
         ViewBag.Link2="B";
         ViewBag.Link13"C";
         ViewBag.Link3="D";
         return View("ViewName",model);
        }
    

    内部视图 //.Link1

    if(ViewBag.Link1)
    {
    }
    if(ViewBag.Link2)
    {
    }
    if(ViewBag.Link3)
    {
    }
    if(ViewBag.Link4)
    {
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2021-11-14
      • 2012-02-10
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多