【问题标题】:Pass data from view to controller method将数据从视图传递到控制器方法
【发布时间】:2016-03-21 13:48:53
【问题描述】:

我需要在控制器的方法中使用当前视图的名称 在我看来,我可以使用下面的代码获取名称。

我想将此 @ViewData["pageName"] 传递给我的 MakeChange 操作结果 在我的控制器中。每次我逐步完成 MakeChange 方法时,我都会得到 是“对象引用未设置为对象的实例”

如何将数据从视图传递到控制器方法?

            @ViewData["pageName"] =  @Path.GetFileName(Server.MapPath(VirtualPath))


             public ActionResult MakeChange(string lang)
                    {
                        string getPageName = ViewData["pageName"].ToString();

                        return RedirectToAction(getPageName, "Home");
                    }

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    您不能使用 ViewData 将数据从视图传递到控制器。您可以使用 ViewData 将数据从 Controller 传递到您的视图。

    要达到你想要的,你可以这样做:

    <input type='hidden' name='lang' value='@Path.GetFileName(Server.MapPath(VirtualPath))' />
    
    <input type='submit' value='send'>
    

    Ps:你应该把输入放在一个表单标签内。

    【讨论】:

    【解决方案2】:

    Path.GetFileName(Server.MapPath(VirtualPath)) 将为您提供带有扩展名的剃刀视图名称(例如:index.cshtml)。您不能将其与 RedirectToAction 方法一起使用,因为 RedirectToAction 方法正在寻找操作方法名称。使用前需要修剪文件扩展名部分。

    要将其发送到控制器操作,您可以将值保存在表单内的隐藏字段中。当用户发布表单时,它将在您的 HttpPost 操作方法中可用。您需要确保有一个与隐藏字段的名称值同名的参数。

    @using (Html.BeginForm())
    {
       <input type="text" name="lang" value="English" />
       <input type="hidden" name="pageName" 
                                     value="@Path.GetFileName(Server.MapPath(VirtualPath))" />
    
       <input id="BtnAdd" type="submit" value="Save" />
    
    }
    

    所以你的操作方法将是

    public ActionResult MakeChange(string lang,string pageName)
    {
       var viewName=pageName;
       //Get rid of the extension.
       viewName = viewName.Replace(".cshtml","");
       return RedirectToAction(viewName , "Home");
    }
    

    即使你在做一个 ajax 帖子,它仍然可以工作,只需序列化你的表单并发送它

    $("#BtnAdd").click(function(e){
       e.preventDefault();
       var _this = $(this); 
       $.post("@Url.Action("MakeChange","Home")",_this.closest("form").serialize(),
                                                                           function(response){
    
            //do something with response
        });
    });
    

    没有我们所做的文件扩展名修剪方法,有更简洁的方法来获取视图名称。看看this answer

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多